<?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=Braindamage</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=Braindamage"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Braindamage"/>
	<updated>2026-11-08T18:13:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11028</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11028"/>
		<updated>2013-10-10T16:55:43Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added new return val for UnitCmdDone and UnitCommand for spring 95.0&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;
==Engine Source==&lt;br /&gt;
If you can understand Lua code well and wish to get the most up to date info, you can refer to:&lt;br /&gt;
{{sourcelink|file=cont/base/springcontent/LuaGadgets/actions.lua}}, &lt;br /&gt;
{{sourcelink|file=cont/LuaUI/widgets.lua}} and &amp;lt;br&amp;gt;&lt;br /&gt;
{{sourcelink|file=cont/base/springcontent/LuaGadgets/gadgets.lua}} &amp;lt;br&amp;gt;&lt;br /&gt;
to see how widget/gadget call-ins are distributed, find call-in and widgetHandler function definitions, see how they are processed and what values should be returned from some call ins&lt;br /&gt;
(are these the only files?)&lt;br /&gt;
&lt;br /&gt;
==What is a callin anyway?==&lt;br /&gt;
Call-ins are calls from the engine, into the gadget or widget script. In other words, these functions are called when a particular â€œeventâ€ happens.&lt;br /&gt;
Some call-in functions can return values to the engine.&lt;br /&gt;
===Blocking events with return values===&lt;br /&gt;
The call-in functions named &#039;&#039;&#039;&#039;&#039;Allow&#039;&#039;&#039;&#039;&#039;XXX can block their event by returning &#039;&#039;false&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
For example &#039;&#039;AllowUnitTransfer()&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return true&amp;lt;/code&amp;gt; = allow transfer &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return false&amp;lt;/code&amp;gt; = deny transfer&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Initialize()&amp;lt;/font&amp;gt; --&amp;gt; none.&amp;lt;br&amp;gt;&lt;br /&gt;
called when widget/gadget gets (re-)loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerChanged&amp;lt;/font&amp;gt; --&amp;gt; (playerID).&lt;br /&gt;
gadget/widget: Use this to check whether a player has become spectator for instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;button parameter values: left - 1, middle - 2, right - 3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Please note that in order to have Spring call MouseRelease, you need to have a MousePress call-in in the same widget that returns true.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseWheel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;up, value&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MapDrawCmd()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, cmdType, px, py, pz, labeltext&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z, facing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Update()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;dt&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;called every screenframe. dt is the time since the last screenframe&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DefaultCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;type,id&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;can return an [[Lua_CMDs|CMD]] to change cursor and command. {{forumlink|topic=26438|title=example usage}}&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowDirectUnitControl(unitID, unitDefID, unitTeam, playerID)   &amp;lt;/font&amp;gt; -&amp;gt; allowFpsControl&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;return true&#039;&#039; allows fps mode, &#039;&#039;return false&#039;&#039; blocks it.&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(prior to 94.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(as of 94.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(as of 95.0)&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Can overwrite the taken damage by returning a new number value.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
As of 88.0 for both UnitDamaged and UnitPreDamaged:&lt;br /&gt;
     weaponDefID -1 --&amp;gt; debris collision&lt;br /&gt;
     weaponDefID -2 --&amp;gt; ground collision&lt;br /&gt;
     weaponDefID -3 --&amp;gt; object collision&lt;br /&gt;
     weaponDefID -4 --&amp;gt; fire damage&lt;br /&gt;
     weaponDefID -5 --&amp;gt; water damage&lt;br /&gt;
     weaponDefID -6 --&amp;gt; kill damage&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitExperience()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, experience, oldExperience&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Spring.SetExperienceGrade must be called first to determine how often it is called&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, builderID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, attackerID, attackerDefID, attackerTeamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdOpts, cmdParams, cmdTag&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cmdTag only available from version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for unitDefIDs registered via [[Lua_System#Synced|Script.SetWatchUnit]] since 85.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShieldPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnitCollision(colliderID, collideeID)&amp;lt;/font&amp;gt; -- needs SetWatchUnit enabled for both parties&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowWeaponTargetCheck(attackerID, attackerWeaponNum, attackerWeaponDefID)&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]] since 92.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowWeaponTarget(attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defaultPriority)&amp;lt;/font&amp;gt; &lt;br /&gt;
 --&amp;gt; &amp;lt;code&amp;gt;return &amp;quot;targetAllowed, targetPriority&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;, defaultPriority new in 89.0&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]] since 92.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawShield(number unitID, number weaponID)&amp;lt;/font&amp;gt; --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;true&#039;&#039; (&amp;lt;-?) skips Spring&#039;s own drawing of shield &amp;lt;weaponID&amp;gt; owned by unit &amp;lt;unitID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/spring/spring/commit/7bbfd9464d4f74c12163ea0740c8c60d1ba978f1 maybe new in 86.0+]&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag, cmdParams, cmdOptions&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cmdParams and cmdOptions are only available from version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFeatureCollision(colliderID, collideeID, crushKilled)&amp;lt;/font&amp;gt; -- needs SetWatchUnit for first and SetWatchFeature for second party&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
Inside these functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
 Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
 Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
 Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawFeature(featureID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawShield(unitID, weaponID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawProjectile(projectileID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameID()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;gameID&amp;quot; {{new|89.0}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;return true to hide the weapon&#039;s CEG&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail. &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameProgress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;serverFrameNum&amp;quot; ( called every 60 frames, calculating delta between GameFrame and GameProgress can give an ETA about catching up with simulation )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt;  &amp;quot;[ [1] = allyTeamID1, [2] = allyTeamID2, ... ]&amp;quot;,  a list of winning allyteams, if empty the game result was undecided ( like when dropping from an host )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;   Will return nil in pre 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowStartPosition()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;cx, cy, cz, playerID, readyState, rx, ry, rz&amp;quot;, where rx,ry,rz are the position the player picked and cx,cy,cz are that position clamped to the startbox. readyState can be any one of &amp;lt;br&amp;gt; 0 -- player picked a position, &amp;lt;br&amp;gt; 1 -- player clicked ready,  &amp;lt;br&amp;gt; 2 -- game was force-started (player did not click ready)&lt;br /&gt;
&amp;lt;br&amp;gt;return true/false to allow/deny placing startposition marker&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameSetup()&amp;lt;/font&amp;gt; --&amp;gt; string &amp;quot;state&amp;quot;, boolean &amp;quot;ready&amp;quot;, table &amp;quot;playerStates&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;return success, newReady&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePaused()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, paused&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerAdded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerRemoved()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, reason&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID, weaponDefID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11027</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11027"/>
		<updated>2013-10-10T16:53:49Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: MapDrawCmd has been available since ever, just not forwarded in default gadgethandler whilst available in default widgethandler&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;
==Engine Source==&lt;br /&gt;
If you can understand Lua code well and wish to get the most up to date info, you can refer to:&lt;br /&gt;
{{sourcelink|file=cont/base/springcontent/LuaGadgets/actions.lua}}, &lt;br /&gt;
{{sourcelink|file=cont/LuaUI/widgets.lua}} and &amp;lt;br&amp;gt;&lt;br /&gt;
{{sourcelink|file=cont/base/springcontent/LuaGadgets/gadgets.lua}} &amp;lt;br&amp;gt;&lt;br /&gt;
to see how widget/gadget call-ins are distributed, find call-in and widgetHandler function definitions, see how they are processed and what values should be returned from some call ins&lt;br /&gt;
(are these the only files?)&lt;br /&gt;
&lt;br /&gt;
==What is a callin anyway?==&lt;br /&gt;
Call-ins are calls from the engine, into the gadget or widget script. In other words, these functions are called when a particular â€œeventâ€ happens.&lt;br /&gt;
Some call-in functions can return values to the engine.&lt;br /&gt;
===Blocking events with return values===&lt;br /&gt;
The call-in functions named &#039;&#039;&#039;&#039;&#039;Allow&#039;&#039;&#039;&#039;&#039;XXX can block their event by returning &#039;&#039;false&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
For example &#039;&#039;AllowUnitTransfer()&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return true&amp;lt;/code&amp;gt; = allow transfer &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return false&amp;lt;/code&amp;gt; = deny transfer&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Initialize()&amp;lt;/font&amp;gt; --&amp;gt; none.&amp;lt;br&amp;gt;&lt;br /&gt;
called when widget/gadget gets (re-)loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerChanged&amp;lt;/font&amp;gt; --&amp;gt; (playerID).&lt;br /&gt;
gadget/widget: Use this to check whether a player has become spectator for instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;button parameter values: left - 1, middle - 2, right - 3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Please note that in order to have Spring call MouseRelease, you need to have a MousePress call-in in the same widget that returns true.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseWheel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;up, value&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MapDrawCmd()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, cmdType, px, py, pz, labeltext&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z, facing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Update()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;dt&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;called every screenframe. dt is the time since the last screenframe&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DefaultCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;type,id&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;can return an [[Lua_CMDs|CMD]] to change cursor and command. {{forumlink|topic=26438|title=example usage}}&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowDirectUnitControl(unitID, unitDefID, unitTeam, playerID)   &amp;lt;/font&amp;gt; -&amp;gt; allowFpsControl&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;return true&#039;&#039; allows fps mode, &#039;&#039;return false&#039;&#039; blocks it.&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(prior to 94.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(as of 94.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(as of 95.0)&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Can overwrite the taken damage by returning a new number value.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
As of 88.0 for both UnitDamaged and UnitPreDamaged:&lt;br /&gt;
     weaponDefID -1 --&amp;gt; debris collision&lt;br /&gt;
     weaponDefID -2 --&amp;gt; ground collision&lt;br /&gt;
     weaponDefID -3 --&amp;gt; object collision&lt;br /&gt;
     weaponDefID -4 --&amp;gt; fire damage&lt;br /&gt;
     weaponDefID -5 --&amp;gt; water damage&lt;br /&gt;
     weaponDefID -6 --&amp;gt; kill damage&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitExperience()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, experience, oldExperience&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Spring.SetExperienceGrade must be called first to determine how often it is called&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, builderID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, attackerID, attackerDefID, attackerTeamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdOpts, cmdParams&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for unitDefIDs registered via [[Lua_System#Synced|Script.SetWatchUnit]] since 85.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShieldPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnitCollision(colliderID, collideeID)&amp;lt;/font&amp;gt; -- needs SetWatchUnit enabled for both parties&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowWeaponTargetCheck(attackerID, attackerWeaponNum, attackerWeaponDefID)&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]] since 92.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowWeaponTarget(attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defaultPriority)&amp;lt;/font&amp;gt; &lt;br /&gt;
 --&amp;gt; &amp;lt;code&amp;gt;return &amp;quot;targetAllowed, targetPriority&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;, defaultPriority new in 89.0&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]] since 92.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawShield(number unitID, number weaponID)&amp;lt;/font&amp;gt; --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;true&#039;&#039; (&amp;lt;-?) skips Spring&#039;s own drawing of shield &amp;lt;weaponID&amp;gt; owned by unit &amp;lt;unitID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/spring/spring/commit/7bbfd9464d4f74c12163ea0740c8c60d1ba978f1 maybe new in 86.0+]&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFeatureCollision(colliderID, collideeID, crushKilled)&amp;lt;/font&amp;gt; -- needs SetWatchUnit for first and SetWatchFeature for second party&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
Inside these functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
 Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
 Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
 Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawFeature(featureID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawShield(unitID, weaponID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawProjectile(projectileID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameID()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;gameID&amp;quot; {{new|89.0}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;return true to hide the weapon&#039;s CEG&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail. &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameProgress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;serverFrameNum&amp;quot; ( called every 60 frames, calculating delta between GameFrame and GameProgress can give an ETA about catching up with simulation )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt;  &amp;quot;[ [1] = allyTeamID1, [2] = allyTeamID2, ... ]&amp;quot;,  a list of winning allyteams, if empty the game result was undecided ( like when dropping from an host )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;   Will return nil in pre 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowStartPosition()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;cx, cy, cz, playerID, readyState, rx, ry, rz&amp;quot;, where rx,ry,rz are the position the player picked and cx,cy,cz are that position clamped to the startbox. readyState can be any one of &amp;lt;br&amp;gt; 0 -- player picked a position, &amp;lt;br&amp;gt; 1 -- player clicked ready,  &amp;lt;br&amp;gt; 2 -- game was force-started (player did not click ready)&lt;br /&gt;
&amp;lt;br&amp;gt;return true/false to allow/deny placing startposition marker&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameSetup()&amp;lt;/font&amp;gt; --&amp;gt; string &amp;quot;state&amp;quot;, boolean &amp;quot;ready&amp;quot;, table &amp;quot;playerStates&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;return success, newReady&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePaused()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, paused&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerAdded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerRemoved()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, reason&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID, weaponDefID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11026</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11026"/>
		<updated>2013-10-10T16:51:58Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: UnitCommand has been implemented since ever, just the default gadgethandler misses the forwarding, whilst the default widgethandler does&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;
==Engine Source==&lt;br /&gt;
If you can understand Lua code well and wish to get the most up to date info, you can refer to:&lt;br /&gt;
{{sourcelink|file=cont/base/springcontent/LuaGadgets/actions.lua}}, &lt;br /&gt;
{{sourcelink|file=cont/LuaUI/widgets.lua}} and &amp;lt;br&amp;gt;&lt;br /&gt;
{{sourcelink|file=cont/base/springcontent/LuaGadgets/gadgets.lua}} &amp;lt;br&amp;gt;&lt;br /&gt;
to see how widget/gadget call-ins are distributed, find call-in and widgetHandler function definitions, see how they are processed and what values should be returned from some call ins&lt;br /&gt;
(are these the only files?)&lt;br /&gt;
&lt;br /&gt;
==What is a callin anyway?==&lt;br /&gt;
Call-ins are calls from the engine, into the gadget or widget script. In other words, these functions are called when a particular â€œeventâ€ happens.&lt;br /&gt;
Some call-in functions can return values to the engine.&lt;br /&gt;
===Blocking events with return values===&lt;br /&gt;
The call-in functions named &#039;&#039;&#039;&#039;&#039;Allow&#039;&#039;&#039;&#039;&#039;XXX can block their event by returning &#039;&#039;false&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
For example &#039;&#039;AllowUnitTransfer()&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return true&amp;lt;/code&amp;gt; = allow transfer &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return false&amp;lt;/code&amp;gt; = deny transfer&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Initialize()&amp;lt;/font&amp;gt; --&amp;gt; none.&amp;lt;br&amp;gt;&lt;br /&gt;
called when widget/gadget gets (re-)loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerChanged&amp;lt;/font&amp;gt; --&amp;gt; (playerID).&lt;br /&gt;
gadget/widget: Use this to check whether a player has become spectator for instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;button parameter values: left - 1, middle - 2, right - 3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Please note that in order to have Spring call MouseRelease, you need to have a MousePress call-in in the same widget that returns true.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseWheel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;up, value&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MapDrawCmd()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, cmdType, px, py, pz, labeltext&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z, facing&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Update()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;dt&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;called every screenframe. dt is the time since the last screenframe&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DefaultCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;type,id&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;can return an [[Lua_CMDs|CMD]] to change cursor and command. {{forumlink|topic=26438|title=example usage}}&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowDirectUnitControl(unitID, unitDefID, unitTeam, playerID)   &amp;lt;/font&amp;gt; -&amp;gt; allowFpsControl&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;return true&#039;&#039; allows fps mode, &#039;&#039;return false&#039;&#039; blocks it.&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(prior to 94.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(as of 94.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;(as of 95.0)&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Can overwrite the taken damage by returning a new number value.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
As of 88.0 for both UnitDamaged and UnitPreDamaged:&lt;br /&gt;
     weaponDefID -1 --&amp;gt; debris collision&lt;br /&gt;
     weaponDefID -2 --&amp;gt; ground collision&lt;br /&gt;
     weaponDefID -3 --&amp;gt; object collision&lt;br /&gt;
     weaponDefID -4 --&amp;gt; fire damage&lt;br /&gt;
     weaponDefID -5 --&amp;gt; water damage&lt;br /&gt;
     weaponDefID -6 --&amp;gt; kill damage&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitExperience()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, experience, oldExperience&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Spring.SetExperienceGrade must be called first to determine how often it is called&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, builderID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, attackerID, attackerDefID, attackerTeamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdOpts, cmdParams&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for unitDefIDs registered via [[Lua_System#Synced|Script.SetWatchUnit]] since 85.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShieldPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnitCollision(colliderID, collideeID)&amp;lt;/font&amp;gt; -- needs SetWatchUnit enabled for both parties&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowWeaponTargetCheck(attackerID, attackerWeaponNum, attackerWeaponDefID)&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]] since 92.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowWeaponTarget(attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defaultPriority)&amp;lt;/font&amp;gt; &lt;br /&gt;
 --&amp;gt; &amp;lt;code&amp;gt;return &amp;quot;targetAllowed, targetPriority&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;, defaultPriority new in 89.0&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]] since 92.0&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawShield(number unitID, number weaponID)&amp;lt;/font&amp;gt; --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;true&#039;&#039; (&amp;lt;-?) skips Spring&#039;s own drawing of shield &amp;lt;weaponID&amp;gt; owned by unit &amp;lt;unitID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/spring/spring/commit/7bbfd9464d4f74c12163ea0740c8c60d1ba978f1 maybe new in 86.0+]&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFeatureCollision(colliderID, collideeID, crushKilled)&amp;lt;/font&amp;gt; -- needs SetWatchUnit for first and SetWatchFeature for second party&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
Inside these functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
 Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
 Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
 Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawFeature(featureID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawShield(unitID, weaponID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawProjectile(projectileID, DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameID()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;gameID&amp;quot; {{new|89.0}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;return true to hide the weapon&#039;s CEG&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail. &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameProgress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;serverFrameNum&amp;quot; ( called every 60 frames, calculating delta between GameFrame and GameProgress can give an ETA about catching up with simulation )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt;  &amp;quot;[ [1] = allyTeamID1, [2] = allyTeamID2, ... ]&amp;quot;,  a list of winning allyteams, if empty the game result was undecided ( like when dropping from an host )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;   Will return nil in pre 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowStartPosition()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;cx, cy, cz, playerID, readyState, rx, ry, rz&amp;quot;, where rx,ry,rz are the position the player picked and cx,cy,cz are that position clamped to the startbox. readyState can be any one of &amp;lt;br&amp;gt; 0 -- player picked a position, &amp;lt;br&amp;gt; 1 -- player clicked ready,  &amp;lt;br&amp;gt; 2 -- game was force-started (player did not click ready)&lt;br /&gt;
&amp;lt;br&amp;gt;return true/false to allow/deny placing startposition marker&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameSetup()&amp;lt;/font&amp;gt; --&amp;gt; string &amp;quot;state&amp;quot;, boolean &amp;quot;ready&amp;quot;, table &amp;quot;playerStates&amp;quot; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Not yet implemented!&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;return success, newReady&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePaused()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, paused&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerAdded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;PlayerRemoved()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, reason&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID, weaponDefID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;font color=#dd9944&amp;gt;Only called for weaponDefIDs registered via Script.SetWatchWeapon&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11754</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=11754"/>
		<updated>2013-10-10T14:58:10Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added userTarget param info to SetUnitTarget&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;
&#039;&#039;&#039;Spring.KillTeam&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&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.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GameOver&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( {number allyTeamID1, number allyTeamID2, ...} ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&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&amp;lt;/span&amp;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&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string paramName, number|string paramValue [, table &amp;lt;span class=note&amp;gt;losAccess&amp;lt;/span&amp;gt;] ) -&amp;gt; nil&lt;br /&gt;
   &amp;lt;span class=note&amp;gt;possible values 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;
&#039;&#039;&#039;Spring.SetTeamRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string paramName, number|string paramValue [, table &amp;lt;span class=note&amp;gt;losAccess&amp;lt;/span&amp;gt;] ) -&amp;gt; nil&lt;br /&gt;
   &amp;lt;span class=note&amp;gt;see above for further documentation of losAccess&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetGameRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( string paramName, number|string paramValue [, table &amp;lt;span class=note&amp;gt;losAccess&amp;lt;/span&amp;gt;] ) -&amp;gt; nil&lt;br /&gt;
   &amp;lt;span class=note&amp;gt;see above for further documentation of losAccess&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.UseTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, &lt;br /&gt;
    string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;,number amount |&lt;br /&gt;
    { metal = number amount, energy = number amount}&lt;br /&gt;
  ) -&amp;gt; nil | boolean hadEnough&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string res, number amount ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for res are:&lt;br /&gt;
    &amp;quot;m&amp;quot;  = metal&lt;br /&gt;
    &amp;quot;e&amp;quot;  = energy&lt;br /&gt;
    &amp;quot;ms&amp;quot;  = metal storage&lt;br /&gt;
    &amp;quot;es&amp;quot;  = energy storage&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamShareLevel&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ShareTeamResource&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID_src, number teamID_recv, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateUnit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: offmap positions are clamped! (you still can use MoveCtrl todo so)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number unitDefID,&lt;br /&gt;
    number x, number y, number z,&lt;br /&gt;
    (number facing | string &amp;quot;facing&amp;quot;),&lt;br /&gt;
    number teamID&lt;br /&gt;
    [, boolean build = false] &lt;br /&gt;
    [, boolean flattenGround = true]&lt;br /&gt;
    [, number unitID]&lt;br /&gt;
    [, number builderID]) -&amp;gt; number unitID&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
  if build is true the unit is created in &amp;quot;being built&amp;quot; state, with buildProgress = 0&lt;br /&gt;
  unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with&lt;br /&gt;
  a specific ID.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID&lt;br /&gt;
    [, boolean selfd = false]&lt;br /&gt;
    [, boolean reclaimed = false]&lt;br /&gt;
    [, number attackerID ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
 selfd := makes the unit act like it self-destructed&lt;br /&gt;
 reclaimed := don&#039;t show any DeathSequences, don&#039;t leave a wreckage.&lt;br /&gt;
   NOTE this does _not_ give back the resources to the team!&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    numer newTeamID&lt;br /&gt;
    [, boolean given = true ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;if given=false, the unit is captured&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCosts&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, { &lt;br /&gt;
     [ buildTime  = number amount ],&lt;br /&gt;
     [ metalCost  = number amount ],&lt;br /&gt;
     [ energyCost = number amount ]&lt;br /&gt;
   } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;tooltip&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number health |&lt;br /&gt;
    { [ health   = number health ],&lt;br /&gt;
      [ capture  = number capture ],&lt;br /&gt;
      [ paralyze = number paralyze ],&lt;br /&gt;
      [ build    = number build ] }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMaxHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number maxHealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitDamage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number damage&lt;br /&gt;
    [, number paralyze = 0 [, number attackerID = -1 [, number weaponID = -1&lt;br /&gt;
      [, number impulse_x [, number impulse_y [, number impulse_z ]]] ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number stockpile [, number buildPercent ]]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number experience ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number fuel ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCrashing&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number unitID, boolean crashing ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 83.0&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID, number teamID [, boolean isRoot] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean neutral ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number enemyUnitID | number x, number y, number z,&lt;br /&gt;
    [ boolean dgun = false ], [ boolean userTarget = false ] ) -&amp;gt; nil &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;userTarget new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitBlocking&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;crushable new in version 85.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, boolean blocking [, boolean collide [, boolean crushable]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number depth [,number range] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitBuildSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number builderID,&lt;br /&gt;
    number buildSpeed, [ number repairSpeed [, number reclaimSpeed&lt;br /&gt;
  [,number resurrectSpeed [, number captureSpeed [, number terraformSpeed ]] ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNanoPieces&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number builderID, table pieces ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitArmored&#039;&#039;&#039; &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;
  ( number unitID, boolean armored [, number armorMultiple] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] [, boolean enabled] [, number power] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot;, number mode ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;moveFactor&amp;quot;, number factor) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;minDamage&amp;quot;, number minDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;mazDamage&amp;quot;, number maxDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot;, number x, number y, number z) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum, table states ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&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;aimReady&amp;quot; = number value,] &amp;lt;span class=note&amp;gt;(&amp;lt;&amp;gt;0.0f := true)&amp;lt;/span&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&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;
&#039;&#039;&#039;Spring.SetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceIndex, boolean enableLocal, &lt;br /&gt;
    number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
    number vType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number travel [, number travelPeriod] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMoveGoal&#039;&#039;&#039;   &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;&lt;br /&gt;
  ( number unitID, number x, number y, number z,&lt;br /&gt;
    [, number radius = 0 [, number speed = unit-&amp;gt;maxSpeed * 2 ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPhysics&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number posx, number posy, number posz,&lt;br /&gt;
    number velx, number vely, number velz,&lt;br /&gt;
    number rotx, number roty, number rotz,&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number x, number z [, boolean alwaysAboveSea] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDirection&#039;&#039;&#039; {{new|90.0}}&lt;br /&gt;
  ( number unitID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number velx, number vely, number velz ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitRotation&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number rotx, number roty, number rotz ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitImpulse&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number x, number y, number z [, decayRate ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitSeismicPing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pingSize ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveBuildingDecal&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMidAndAimPos&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, &lt;br /&gt;
    number mpx, number mpy, number mpz, &lt;br /&gt;
    number apx, number apy, number apz, &lt;br /&gt;
    [, boolean relative] ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
mpx, mpy, mpz: new middle position of unit&lt;br /&gt;
&lt;br /&gt;
apx, apy, apz: new position that enemies aim at on this unit&lt;br /&gt;
&lt;br /&gt;
relative: are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitRadiusAndHeight&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, number radius, number height ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitWeaponFire&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitWeaponHoldFire&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCloak&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    boolean cloaked | number scriptCloak,&lt;br /&gt;
    [ number decloakDistance | boolean decloakAbs ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  If the 2nd argument is a number, the value works like this:&lt;br /&gt;
   1:=normal cloak&lt;br /&gt;
   2:=for free cloak (cost no E)&lt;br /&gt;
   3:=for free + no decloaking (except the unit is stunned)&lt;br /&gt;
   4&amp;gt;=ultimative cloak (no ecost, no decloaking, no stunned decloak)&lt;br /&gt;
&lt;br /&gt;
  The decloak distance is only changed if the 3th argument is a number or a boolean.&lt;br /&gt;
   If the boolean is false it takes the default decloak distance for that unitdef,&lt;br /&gt;
   if the boolean is true it takes the absolute value of it.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSonarStealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean sonarStealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitStealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean stealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean alwaysVisible ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLosMask&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number allyTeam, number los | table losTypes ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;the 3th argument is either the bit-and combination of the following numbers:&lt;br /&gt;
  LOS_INLOS     = 1&lt;br /&gt;
  LOS_INRADAR   = 2&lt;br /&gt;
  LOS_PREVLOS   = 4&lt;br /&gt;
  LOS_CONTRADAR = 8&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;or a table of the following form:&lt;br /&gt;
  losTypes = {&lt;br /&gt;
    [los = boolean,]&lt;br /&gt;
    [radar = boolean,]&lt;br /&gt;
    [prevLos = boolean,]&lt;br /&gt;
    [contRadar = boolean,]&lt;br /&gt;
  }&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLosState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number allyTeam, number los | table losTypes ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;see above for more info on the arguments&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type, number radius ) -&amp;gt; nil | number newRadius&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;type can be:&lt;br /&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;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitResourcing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    string res, number amount |&lt;br /&gt;
    { res = number amount, ... }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for res are: &amp;quot;[u|c][u|m][m|e]&amp;quot;&lt;br /&gt;
       unconditional | conditional&lt;br /&gt;
                 use | make&lt;br /&gt;
               metal | energy&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UseUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil | boolean okay&lt;br /&gt;
  ( number unitID, { [&amp;quot;m&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;e&amp;quot; | &amp;quot;energy&amp;quot;] = amount, ... } ) -&amp;gt; nil | boolean okay&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateFeature&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number featureDefID, &lt;br /&gt;
    number x, number y, number z&lt;br /&gt;
    [, number heading &lt;br /&gt;
    [, number AllyTeamID &lt;br /&gt;
    [, number featureID ]]] ) -&amp;gt; number featureID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number health) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureReclaim&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number reclaimLeft) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, string &amp;quot;UnitDefName?&amp;quot; [, number facing | string &amp;quot;facing&amp;quot; ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z [, boolean snapToGround]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitCollisionVolumeData for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMidAndAimPos&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, &lt;br /&gt;
    number mpx, number mpy, number mpz, &lt;br /&gt;
    number apx, number apy, number apz, &lt;br /&gt;
    [, boolean relative] ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitMidAndAimPos for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRadiusAndHeight&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, number radius, number height ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;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;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&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 Game.squareSize.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Example code:&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&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)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;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;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&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;
    [ 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;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
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)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade&lt;br /&gt;
   &amp;lt;font color=#55ee99&amp;gt;[, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]]&amp;lt;/font&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
   it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
   If this integer differs from the one before the experience change&lt;br /&gt;
   it will call UnitExperience().&lt;br /&gt;
  Also those 3 last params are only available in .cheat&lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot;,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&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,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, &lt;br /&gt;
    [ targetID, targetType ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetType 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;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=11981</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=11981"/>
		<updated>2013-09-01T13:55:31Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added GetUnitWeaponTarget infos&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;(those special TeamIDs are not supported by all functions)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALL_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.MY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALLY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ENEMY_UNITS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGaiaTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGodModeEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsCheatingEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsDevLuaEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsEditDefsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.AreHelperAIsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FixedAllies&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGameOver&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Those functions allow to save data per Game,Team and Unit.&amp;lt;br&amp;gt;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;
&#039;&#039;&#039;Spring.GetRulesInfoMap&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;REMOVED in 0.82!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; { [key1] = string value1, [key2] = string value2, ... }&lt;br /&gt;
  ( string &amp;quot;key&amp;quot; ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number ruleIndex | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number | string value1}, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number index | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number | string value1}, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number index | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number | string value1}, ... }&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! bool values are not transfered from C to Lua correctly, so in IF theres needed to use this condition:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&amp;quot;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
not only:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;quot;if (Spring.GetModOptions.exampleOption) then...end&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number frameNum%dayFrames, number frameNum/dayFrames&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWind&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number dirX, number dirY, number dirZ, &lt;br /&gt;
         number strength,  number normDirX, number normDirY, number normDirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHeadingFromVector&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVectorFromHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number heading ) -&amp;gt; number x, number z&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSideData&#039;&#039;&#039;&lt;br /&gt;
  ( string sideName ) -&amp;gt; nil | string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( number sideID ) -&amp;gt; nil | string sideName, string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( ) -&amp;gt; { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamStartBox&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID ) -&amp;gt; nil | number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerList&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])&lt;br /&gt;
  -&amp;gt; nil | { [1] = number playerID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1] ) -&amp;gt; nil | { [1] = number teamID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number allyTeamID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; &lt;br /&gt;
    nil | string  &amp;quot;name&amp;quot;,  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(PRE-83.0: in synced code this is &amp;quot;SYNCED_NONAME&amp;quot;!)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean active,&lt;br /&gt;
          boolean spectator,&lt;br /&gt;
          number  teamID,&lt;br /&gt;
          number  allyTeamID,&lt;br /&gt;
          number  pingTime,&lt;br /&gt;
          number  cpuUsage,&lt;br /&gt;
          string  country,&lt;br /&gt;
          number  rank&lt;br /&gt;
          table   customPlayerKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerControlledUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAIInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; &lt;br /&gt;
          number  skirmishAIID,&lt;br /&gt;
          string  name,&lt;br /&gt;
          number  hostingPlayerID,&lt;br /&gt;
          string  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;&lt;br /&gt;
          string  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;&lt;br /&gt;
          table   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;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number allyteamID ) -&amp;gt; nil | table   customTeamKeys&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number  teamID,&lt;br /&gt;
          number  leader, &amp;lt;span class=note&amp;gt;(:= a player id)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean isDead,&lt;br /&gt;
          boolean isAiTeam,&lt;br /&gt;
          string  &amp;quot;side&amp;quot;,&lt;br /&gt;
          number  allyTeam,&lt;br /&gt;
          table   customTeamKeys,&lt;br /&gt;
          number  incomeMultiplier&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResources&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number currentLevel,&lt;br /&gt;
          number storage,&lt;br /&gt;
          number pull,&lt;br /&gt;
          number income,&lt;br /&gt;
          number expense,&lt;br /&gt;
          number share,&lt;br /&gt;
          number sent,&lt;br /&gt;
          number received&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitStats&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number killed,&lt;br /&gt;
          number died,&lt;br /&gt;
          number capturedBy,&lt;br /&gt;
          number capturedFrom,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResourceStats&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID,  string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number used,&lt;br /&gt;
          number produced,&lt;br /&gt;
          number excessed,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStatsHistory&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID [, number startIndex [, number endIndex = startIndex ]]) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number cur_max_index |&lt;br /&gt;
    {&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;
   }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamLuaAI&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; string &amp;quot;luaAI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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, so maybe depends, but in my LuaAI.lua name is on first position...&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&#039;&#039;&#039;Spring.AreTeamsAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID1, number teamID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ArePlayersAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID1, number playerID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil |&lt;br /&gt;
    unitDefTable = {&lt;br /&gt;
      [number unitDefID] = { [1] = [number unitID], etc... },&lt;br /&gt;
      etc...&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | countTable = { [number unitDefID] = count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsByDefs&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID | { number unitDefID1, ... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitDefCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID ) -&amp;gt; nil | number count&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) &lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInBox&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number ymin, number zmin,&lt;br /&gt;
    number xmax, number ymax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInPlanes&#039;&#039;&#039;&lt;br /&gt;
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  plane normals point towards accepted space,&lt;br /&gt;
  so the acceptance criteria for each plane is:&lt;br /&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&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestAlly&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range ] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestEnemy&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range [, bool useLOS]] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
build Progress is returned as floating Point between 0.0 and 1.0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039; &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;
  ( number unitID ) -&amp;gt; nil | boolean armored, number armorMultiple&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&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;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBlocking&#039;&#039;&#039; {{new|85.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean blocking, boolean crushable&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number bpx, number bpy, number bpz [,&lt;br /&gt;
    number mpx, number mpy, number mpz [,&lt;br /&gt;
    number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 89.0, use GetUnitPosition&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns the direction vector&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns heading directions used in COB scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns what unit a constructor/factory is currently building&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCurrentBuildPower&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number buildPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNanoPieces&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number piece1, etc ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(returns the distance of 2 units)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D ] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&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;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&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;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Consider this broken. It returns reverse direction in piece space (i.e. vertex(0)-vertex(1)) for pieces with &amp;gt;= 2 vertices and (1,1,1) for pieces with &amp;lt; 2 vertices)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&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;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;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 via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;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.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | 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;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(same as Spring.GetUnitCommands)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | 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;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | 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;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&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;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
=== Ground Informations ===&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;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&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;
  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;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;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;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number targetID, string targetType&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetType 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;
   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents:  &lt;br /&gt;
   more info here:[[http://springrts.com/wiki/Animation-CobConstants#explode]]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3378</id>
		<title>Building Spring on Linux</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3378"/>
		<updated>2013-08-02T14:48:52Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: Undo revision 27478 by Braindamage (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Build From Source on Linux =&lt;br /&gt;
If you prefer to use your distributions package system (release versions only), refer to the Linux [[SetupGuide]].&lt;br /&gt;
&lt;br /&gt;
If there is no package tailored for your distribution, you have to install from sources manually. Doing this for distributions where packages are available is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Be careful when building from source.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
You might encounter sync errors in online play if:&lt;br /&gt;
* you are using an untested compiler (&#039;&#039;gcc&#039;&#039; from the 4.x serie should be safe)&lt;br /&gt;
* you use non-standard compiler settings (be careful about &#039;&#039;-march&#039;&#039;)!&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtaining the Source ==&lt;br /&gt;
{{Obtaining_The_Source_Code}}&lt;br /&gt;
&lt;br /&gt;
= Get Dependencies =&lt;br /&gt;
&lt;br /&gt;
To compile, you will have to install some development packages Spring depends on. These vary from distro to distro and may also depend on your specific configuration.&lt;br /&gt;
&lt;br /&gt;
If your distributions is not listed below, you should be able to figure out the correct package names from this.&lt;br /&gt;
&lt;br /&gt;
== Full list ==&lt;br /&gt;
* Programs necessary to build&lt;br /&gt;
** &#039;&#039;cmake&#039;&#039;&lt;br /&gt;
** &#039;&#039;7zip&#039;&#039; (aka &#039;&#039;p7zip&#039;&#039; or &#039;&#039;7z&#039;&#039;)&lt;br /&gt;
** The usual build toolchain&lt;br /&gt;
*** &#039;&#039;gcc&#039;&#039;&lt;br /&gt;
*** &#039;&#039;make&#039;&#039;&lt;br /&gt;
* Libraries&lt;br /&gt;
** SDL&lt;br /&gt;
** &#039;&#039;boost&#039;&#039; (version 1.35 or later)&lt;br /&gt;
*** &#039;&#039;threads&#039;&#039;&lt;br /&gt;
*** &#039;&#039;regex&#039;&#039;&lt;br /&gt;
*** &#039;&#039;signals&#039;&#039;&lt;br /&gt;
*** &#039;&#039;system&#039;&#039;&lt;br /&gt;
*** &#039;&#039;program-options&#039;&#039;&lt;br /&gt;
** &#039;&#039;libdeviL&#039;&#039; (IL)&lt;br /&gt;
** OpenAL (openal-soft, older openal-0.0.8 does not work)&lt;br /&gt;
** OpenGL headers (mesa, GLEW, etc.)&lt;br /&gt;
** &#039;&#039;zlib&#039;&#039;&lt;br /&gt;
** &#039;&#039;freetype&#039;&#039; (2)&lt;br /&gt;
** &#039;&#039;ogg&#039;&#039;, &#039;&#039;vorbis&#039;&#039; and &#039;&#039;vorbisfile&#039;&#039;&lt;br /&gt;
* Optional (for AI Interfaces and Skirmish AIs)&lt;br /&gt;
** &#039;&#039;python&#039;&#039; (2.5+)&lt;br /&gt;
** &#039;&#039;jdk&#039;&#039; (1.5+)&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
&lt;br /&gt;
For Etch (debian 4.0 stable) and Sid (debian unstable), I&#039;ve confirmed the&lt;br /&gt;
following to be the minimal set that is necessary to get. This works with Ubuntu 8.10, too.&lt;br /&gt;
As of ~ July 2009, spring depends on boost 1.35+ (if your distro is behind, you can try [https://launchpad.net/~pgquiles/+archive/ppa some unofficial backports]). &lt;br /&gt;
&lt;br /&gt;
Also, on 64-bit, be sure to build against DevIL 1.6.8-rc2+, as 1.6.7 has a bug in the PNG loading code that causes issues.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo aptitude install build-essential zlib1g-dev libfreetype6-dev cmake&lt;br /&gt;
sudo aptitude install libsdl1.2-dev libopenal-dev libglew-dev zip&lt;br /&gt;
sudo aptitude install libvorbis-dev libxcursor-dev libdevil-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-dev libboost-system1.37-thread-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-regex-dev &lt;br /&gt;
sudo aptitude install libboost-system1.37-serialization-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-program-options-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and cmake, depending on what you use for building (I advise to use cmake). On debian 5.0 (lenny), libglew1.5-dev is required as well.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu  ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# compiler and build tools&lt;br /&gt;
sudo apt-get install build-essential cmake cmake-gui git &lt;br /&gt;
&lt;br /&gt;
# spring dependencies&lt;br /&gt;
sudo apt-get install libglew-dev libsdl-dev libdevil-dev libopenal-dev \&lt;br /&gt;
 libogg-dev libvorbis-dev libfreetype6-dev p7zip-full libxcursor-dev \&lt;br /&gt;
 libboost-thread-dev libboost-regex-dev libboost-system-dev \&lt;br /&gt;
 libboost-program-options-dev libboost-signals-dev&lt;br /&gt;
&lt;br /&gt;
# alternatively, you can try ...&lt;br /&gt;
sudo apt-get build-dep spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... and that should install all the required dependencies (&#039;&#039;it should but it appears to be broken - SpliFF 2011-02-21&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
NOTE: On Ubuntu the CMake scripts currently don&#039;t detect FREETYPE_INCLUDE_DIR. You will need to set this by hand (using -DFREETYPE_INCLUDE_DIR=&amp;quot;/usr/include/freetype2/freetype&amp;quot; or by adding an &#039;advanced&#039; entry in cmake-gui).&lt;br /&gt;
(this problem is either not reproducible with Ubuntu 10.10, or not present in spring master anymore)&lt;br /&gt;
&lt;br /&gt;
to speed up compiling/linking, you can install gold, an alternative linker and an ccache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;sudo apt-get install binutils-gold ccache&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to make ccache useful, the cache size needs to be increased by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;ccache -M 5G&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to set it to 5GB.&lt;br /&gt;
&lt;br /&gt;
== Gentoo ==&lt;br /&gt;
This has been tested to work with a clean install of gentoo 2008.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
emerge cmake \&amp;gt;=media-libs/freetype-2.0.0 \&amp;gt;=media-libs/libsdl-1.2.0&lt;br /&gt;
emerge media-libs/openal media-libs/glew dev-libs/boost&lt;br /&gt;
emerge app-arch/zip media-libs/libogg&lt;br /&gt;
USE=&amp;quot;png jpg tiff opengl&amp;quot; emerge media-libs/devil &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fedora ==&lt;br /&gt;
&lt;br /&gt;
On Fedora 8:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install cmake boost-devel openal-devel SDL-devel \&lt;br /&gt;
DevIL-devel glew-devel libvorbis-devel &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On Fedora 12-15:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gcc-c++ cmake boost-devel DevIL-devel freetype-devel \&lt;br /&gt;
glew-devel libvorbis-devel libXcursor-devel openal-devel SDL-devel p7zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slackware ==&lt;br /&gt;
&lt;br /&gt;
On Slackware 13, cmake, ogg &amp;amp; vorbis, boost, glew and SDL already come with the full regular install, both libs and headers. You can find helper scripts to easily compile and package DevIL, OpenAL and spring itself [http://slackbuilds.org/ here].&lt;br /&gt;
&lt;br /&gt;
= Build And Install =&lt;br /&gt;
&lt;br /&gt;
== Using CMake (2.6 or newer) ==&lt;br /&gt;
Configure and build:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake .&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Default install paths are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/bin/spring&amp;lt;/code&amp;gt; Spring executable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/share/games/spring&amp;lt;/code&amp;gt; read-only data&lt;br /&gt;
&lt;br /&gt;
If you want &amp;lt;code&amp;gt;~/spring&amp;lt;/code&amp;gt; prefix instead of &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;, configure like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DCMAKE_INSTALL_PREFIX=~/spring .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
For further ways of customizing your build, have a look at the variables shown with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -LH .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ububtu 9.10 - if it cannot locate freetype include dir, then use:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DFREETYPE_INCLUDE_DIR=/usr .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you experience performance problems on multi-core systems, you may additionally build the MT version of spring:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And install with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other targets are: &amp;lt;code&amp;gt;spring-headless&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;spring-dedicated&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Troubleshooting_linux}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3377</id>
		<title>Building Spring on Linux</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3377"/>
		<updated>2013-08-02T14:48:32Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: Undo revision 27480 by Braindamage (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Build From Source on Linux =&lt;br /&gt;
If you prefer to use your distributions package system (release versions only), refer to the Linux [[SetupGuide]].&lt;br /&gt;
&lt;br /&gt;
If there is no package tailored for your distribution, you have to install from sources manually. Doing this for distributions where packages are available is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Be careful when building from source.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
You might encounter sync errors in online play if:&lt;br /&gt;
* you are using an untested compiler (&#039;&#039;gcc&#039;&#039; from the 4.x serie should be safe)&lt;br /&gt;
* you use non-standard compiler settings (be careful about &#039;&#039;-march&#039;&#039;)!&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtaining the Source ==&lt;br /&gt;
{{Obtaining_The_Source_Code}}&lt;br /&gt;
&lt;br /&gt;
= Get Dependencies =&lt;br /&gt;
&lt;br /&gt;
To compile, you will have to install some development packages Spring depends on. These vary from distro to distro and may also depend on your specific configuration.&lt;br /&gt;
&lt;br /&gt;
If your distributions is not listed below, you should be able to figure out the correct package names from this.&lt;br /&gt;
&lt;br /&gt;
== Full list ==&lt;br /&gt;
* Programs necessary to build&lt;br /&gt;
** &#039;&#039;cmake&#039;&#039;&lt;br /&gt;
** &#039;&#039;7zip&#039;&#039; (aka &#039;&#039;p7zip&#039;&#039; or &#039;&#039;7z&#039;&#039;)&lt;br /&gt;
** The usual build toolchain&lt;br /&gt;
*** &#039;&#039;gcc&#039;&#039;&lt;br /&gt;
*** &#039;&#039;make&#039;&#039;&lt;br /&gt;
* Libraries&lt;br /&gt;
** SDL&lt;br /&gt;
** &#039;&#039;boost&#039;&#039; (version 1.35 or later)&lt;br /&gt;
*** &#039;&#039;threads&#039;&#039;&lt;br /&gt;
*** &#039;&#039;regex&#039;&#039;&lt;br /&gt;
*** &#039;&#039;signals&#039;&#039;&lt;br /&gt;
*** &#039;&#039;system&#039;&#039;&lt;br /&gt;
*** &#039;&#039;program-options&#039;&#039;&lt;br /&gt;
** &#039;&#039;libdeviL&#039;&#039; (IL)&lt;br /&gt;
** OpenAL (openal-soft, older openal-0.0.8 does not work)&lt;br /&gt;
** OpenGL headers (mesa, GLEW, etc.)&lt;br /&gt;
** &#039;&#039;zlib&#039;&#039;&lt;br /&gt;
** &#039;&#039;freetype&#039;&#039; (2)&lt;br /&gt;
** &#039;&#039;ogg&#039;&#039;, &#039;&#039;vorbis&#039;&#039; and &#039;&#039;vorbisfile&#039;&#039;&lt;br /&gt;
* Optional (for AI Interfaces and Skirmish AIs)&lt;br /&gt;
** &#039;&#039;python&#039;&#039; (2.5+)&lt;br /&gt;
** &#039;&#039;jdk&#039;&#039; (1.5+)&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
&lt;br /&gt;
For Etch (debian 4.0 stable) and Sid (debian unstable), I&#039;ve confirmed the&lt;br /&gt;
following to be the minimal set that is necessary to get. This works with Ubuntu 8.10, too.&lt;br /&gt;
As of ~ July 2009, spring depends on boost 1.35+ (if your distro is behind, you can try [https://launchpad.net/~pgquiles/+archive/ppa some unofficial backports]). &lt;br /&gt;
&lt;br /&gt;
Also, on 64-bit, be sure to build against DevIL 1.6.8-rc2+, as 1.6.7 has a bug in the PNG loading code that causes issues.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo aptitude install build-essential zlib1g-dev libfreetype6-dev cmake&lt;br /&gt;
sudo aptitude install libsdl1.2-dev libopenal-dev libglew-dev zip&lt;br /&gt;
sudo aptitude install libvorbis-dev libxcursor-dev libdevil-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-dev libboost-system1.37-thread-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-regex-dev &lt;br /&gt;
sudo aptitude install libboost-system1.37-serialization-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-program-options-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and cmake, depending on what you use for building (I advise to use cmake). On debian 5.0 (lenny), libglew1.5-dev is required as well.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu  ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# compiler and build tools&lt;br /&gt;
sudo apt-get install build-essential cmake cmake-gui git &lt;br /&gt;
&lt;br /&gt;
# spring dependencies&lt;br /&gt;
sudo apt-get install libglew-dev libsdl-dev libdevil-dev libopenal-dev \&lt;br /&gt;
 libogg-dev libvorbis-dev libfreetype6-dev p7zip-full libxcursor-dev \&lt;br /&gt;
 libboost-thread-dev libboost-regex-dev libboost-system-dev \&lt;br /&gt;
 libboost-program-options-dev libboost-signals-dev&lt;br /&gt;
&lt;br /&gt;
# alternatively, you can try ...&lt;br /&gt;
sudo apt-get build-dep spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... and that should install all the required dependencies (&#039;&#039;it should but it appears to be broken - SpliFF 2011-02-21&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
NOTE: On Ubuntu the CMake scripts currently don&#039;t detect FREETYPE_INCLUDE_DIR. You will need to set this by hand (using -DFREETYPE_INCLUDE_DIR=&amp;quot;/usr/include/freetype2/freetype&amp;quot; or by adding an &#039;advanced&#039; entry in cmake-gui).&lt;br /&gt;
(this problem is either not reproducible with Ubuntu 10.10, or not present in spring master anymore)&lt;br /&gt;
&lt;br /&gt;
to speed up compiling/linking, you can install gold, an alternative linker and an ccache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;sudo apt-get install binutils-gold ccache&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to make ccache useful, the cache size needs to be increased by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;ccache -M 5G&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to set it to 5GB.&lt;br /&gt;
&lt;br /&gt;
== Gentoo ==&lt;br /&gt;
This has been tested to work with a clean install of gentoo 2008.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
emerge cmake \&amp;gt;=media-libs/freetype-2.0.0 \&amp;gt;=media-libs/libsdl-1.2.0&lt;br /&gt;
emerge media-libs/openal media-libs/glew dev-libs/boost&lt;br /&gt;
emerge app-arch/zip media-libs/libogg&lt;br /&gt;
USE=&amp;quot;png jpg tiff opengl&amp;quot; emerge media-libs/devil &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fedora ==&lt;br /&gt;
&lt;br /&gt;
On Fedora 8:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install cmake boost-devel openal-devel SDL-devel \&lt;br /&gt;
DevIL-devel glew-devel libvorbis-devel &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On Fedora 12-15:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gcc-c++ cmake boost-devel DevIL-devel freetype-devel \&lt;br /&gt;
glew-devel libvorbis-devel libXcursor-devel openal-devel SDL-devel p7zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slackware ==&lt;br /&gt;
&lt;br /&gt;
On Slackware 13, cmake, ogg &amp;amp; vorbis, boost, glew and SDL already come with the full regular install, both libs and headers. You can find helper scripts to easily compile and package DevIL, OpenAL and spring itself [http://slackbuilds.org/ here].&lt;br /&gt;
&lt;br /&gt;
= Build And Install =&lt;br /&gt;
&lt;br /&gt;
== Using CMake (2.6 or newer) ==&lt;br /&gt;
Configure and build:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Default install paths are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/bin/spring&amp;lt;/code&amp;gt; Spring executable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/share/games/spring&amp;lt;/code&amp;gt; read-only data&lt;br /&gt;
&lt;br /&gt;
If you want &amp;lt;code&amp;gt;~/spring&amp;lt;/code&amp;gt; prefix instead of &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;, configure like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DCMAKE_INSTALL_PREFIX=~/spring .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
For further ways of customizing your build, have a look at the variables shown with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -LH .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ububtu 9.10 - if it cannot locate freetype include dir, then use:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DFREETYPE_INCLUDE_DIR=/usr .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you experience performance problems on multi-core systems, you may additionally build the MT version of spring:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And install with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other targets are: &amp;lt;code&amp;gt;spring-headless&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;spring-dedicated&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Troubleshooting_linux}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3376</id>
		<title>Building Spring on Linux</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3376"/>
		<updated>2013-08-02T14:42:24Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: updated other cmake usages to be consisent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Build From Source on Linux =&lt;br /&gt;
If you prefer to use your distributions package system (release versions only), refer to the Linux [[SetupGuide]].&lt;br /&gt;
&lt;br /&gt;
If there is no package tailored for your distribution, you have to install from sources manually. Doing this for distributions where packages are available is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Be careful when building from source.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
You might encounter sync errors in online play if:&lt;br /&gt;
* you are using an untested compiler (&#039;&#039;gcc&#039;&#039; from the 4.x serie should be safe)&lt;br /&gt;
* you use non-standard compiler settings (be careful about &#039;&#039;-march&#039;&#039;)!&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtaining the Source ==&lt;br /&gt;
{{Obtaining_The_Source_Code}}&lt;br /&gt;
&lt;br /&gt;
= Get Dependencies =&lt;br /&gt;
&lt;br /&gt;
To compile, you will have to install some development packages Spring depends on. These vary from distro to distro and may also depend on your specific configuration.&lt;br /&gt;
&lt;br /&gt;
If your distributions is not listed below, you should be able to figure out the correct package names from this.&lt;br /&gt;
&lt;br /&gt;
== Full list ==&lt;br /&gt;
* Programs necessary to build&lt;br /&gt;
** &#039;&#039;cmake&#039;&#039;&lt;br /&gt;
** &#039;&#039;7zip&#039;&#039; (aka &#039;&#039;p7zip&#039;&#039; or &#039;&#039;7z&#039;&#039;)&lt;br /&gt;
** The usual build toolchain&lt;br /&gt;
*** &#039;&#039;gcc&#039;&#039;&lt;br /&gt;
*** &#039;&#039;make&#039;&#039;&lt;br /&gt;
* Libraries&lt;br /&gt;
** SDL&lt;br /&gt;
** &#039;&#039;boost&#039;&#039; (version 1.35 or later)&lt;br /&gt;
*** &#039;&#039;threads&#039;&#039;&lt;br /&gt;
*** &#039;&#039;regex&#039;&#039;&lt;br /&gt;
*** &#039;&#039;signals&#039;&#039;&lt;br /&gt;
*** &#039;&#039;system&#039;&#039;&lt;br /&gt;
*** &#039;&#039;program-options&#039;&#039;&lt;br /&gt;
** &#039;&#039;libdeviL&#039;&#039; (IL)&lt;br /&gt;
** OpenAL (openal-soft, older openal-0.0.8 does not work)&lt;br /&gt;
** OpenGL headers (mesa, GLEW, etc.)&lt;br /&gt;
** &#039;&#039;zlib&#039;&#039;&lt;br /&gt;
** &#039;&#039;freetype&#039;&#039; (2)&lt;br /&gt;
** &#039;&#039;ogg&#039;&#039;, &#039;&#039;vorbis&#039;&#039; and &#039;&#039;vorbisfile&#039;&#039;&lt;br /&gt;
* Optional (for AI Interfaces and Skirmish AIs)&lt;br /&gt;
** &#039;&#039;python&#039;&#039; (2.5+)&lt;br /&gt;
** &#039;&#039;jdk&#039;&#039; (1.5+)&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
&lt;br /&gt;
For Etch (debian 4.0 stable) and Sid (debian unstable), I&#039;ve confirmed the&lt;br /&gt;
following to be the minimal set that is necessary to get. This works with Ubuntu 8.10, too.&lt;br /&gt;
As of ~ July 2009, spring depends on boost 1.35+ (if your distro is behind, you can try [https://launchpad.net/~pgquiles/+archive/ppa some unofficial backports]). &lt;br /&gt;
&lt;br /&gt;
Also, on 64-bit, be sure to build against DevIL 1.6.8-rc2+, as 1.6.7 has a bug in the PNG loading code that causes issues.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo aptitude install build-essential zlib1g-dev libfreetype6-dev cmake&lt;br /&gt;
sudo aptitude install libsdl1.2-dev libopenal-dev libglew-dev zip&lt;br /&gt;
sudo aptitude install libvorbis-dev libxcursor-dev libdevil-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-dev libboost-system1.37-thread-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-regex-dev &lt;br /&gt;
sudo aptitude install libboost-system1.37-serialization-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-program-options-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and cmake, depending on what you use for building (I advise to use cmake). On debian 5.0 (lenny), libglew1.5-dev is required as well.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu  ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# compiler and build tools&lt;br /&gt;
sudo apt-get install build-essential cmake cmake-gui git &lt;br /&gt;
&lt;br /&gt;
# spring dependencies&lt;br /&gt;
sudo apt-get install libglew-dev libsdl-dev libdevil-dev libopenal-dev \&lt;br /&gt;
 libogg-dev libvorbis-dev libfreetype6-dev p7zip-full libxcursor-dev \&lt;br /&gt;
 libboost-thread-dev libboost-regex-dev libboost-system-dev \&lt;br /&gt;
 libboost-program-options-dev libboost-signals-dev&lt;br /&gt;
&lt;br /&gt;
# alternatively, you can try ...&lt;br /&gt;
sudo apt-get build-dep spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... and that should install all the required dependencies (&#039;&#039;it should but it appears to be broken - SpliFF 2011-02-21&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
NOTE: On Ubuntu the CMake scripts currently don&#039;t detect FREETYPE_INCLUDE_DIR. You will need to set this by hand (using -DFREETYPE_INCLUDE_DIR=&amp;quot;/usr/include/freetype2/freetype&amp;quot; or by adding an &#039;advanced&#039; entry in cmake-gui).&lt;br /&gt;
(this problem is either not reproducible with Ubuntu 10.10, or not present in spring master anymore)&lt;br /&gt;
&lt;br /&gt;
to speed up compiling/linking, you can install gold, an alternative linker and an ccache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;sudo apt-get install binutils-gold ccache&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to make ccache useful, the cache size needs to be increased by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;ccache -M 5G&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to set it to 5GB.&lt;br /&gt;
&lt;br /&gt;
== Gentoo ==&lt;br /&gt;
This has been tested to work with a clean install of gentoo 2008.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
emerge cmake \&amp;gt;=media-libs/freetype-2.0.0 \&amp;gt;=media-libs/libsdl-1.2.0&lt;br /&gt;
emerge media-libs/openal media-libs/glew dev-libs/boost&lt;br /&gt;
emerge app-arch/zip media-libs/libogg&lt;br /&gt;
USE=&amp;quot;png jpg tiff opengl&amp;quot; emerge media-libs/devil &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fedora ==&lt;br /&gt;
&lt;br /&gt;
On Fedora 8:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install cmake boost-devel openal-devel SDL-devel \&lt;br /&gt;
DevIL-devel glew-devel libvorbis-devel &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On Fedora 12-15:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gcc-c++ cmake boost-devel DevIL-devel freetype-devel \&lt;br /&gt;
glew-devel libvorbis-devel libXcursor-devel openal-devel SDL-devel p7zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slackware ==&lt;br /&gt;
&lt;br /&gt;
On Slackware 13, cmake, ogg &amp;amp; vorbis, boost, glew and SDL already come with the full regular install, both libs and headers. You can find helper scripts to easily compile and package DevIL, OpenAL and spring itself [http://slackbuilds.org/ here].&lt;br /&gt;
&lt;br /&gt;
= Build And Install =&lt;br /&gt;
&lt;br /&gt;
== Using CMake (2.6 or newer) ==&lt;br /&gt;
Configure and build:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Default install paths are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/bin/spring&amp;lt;/code&amp;gt; Spring executable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/share/games/spring&amp;lt;/code&amp;gt; read-only data&lt;br /&gt;
&lt;br /&gt;
If you want &amp;lt;code&amp;gt;~/spring&amp;lt;/code&amp;gt; prefix instead of &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;, configure like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DCMAKE_INSTALL_PREFIX=~/spring ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
For further ways of customizing your build, have a look at the variables shown with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -LH ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ububtu 9.10 - if it cannot locate freetype include dir, then use:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DFREETYPE_INCLUDE_DIR=/usr ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you experience performance problems on multi-core systems, you may additionally build the MT version of spring:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And install with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other targets are: &amp;lt;code&amp;gt;spring-headless&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;spring-dedicated&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Troubleshooting_linux}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3375</id>
		<title>Building Spring on Linux</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3375"/>
		<updated>2013-08-02T14:41:28Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: suggest out-of-source builds by default&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Build From Source on Linux =&lt;br /&gt;
If you prefer to use your distributions package system (release versions only), refer to the Linux [[SetupGuide]].&lt;br /&gt;
&lt;br /&gt;
If there is no package tailored for your distribution, you have to install from sources manually. Doing this for distributions where packages are available is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;&#039;&#039;&#039;Warning:&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Be careful when building from source.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
You might encounter sync errors in online play if:&lt;br /&gt;
* you are using an untested compiler (&#039;&#039;gcc&#039;&#039; from the 4.x serie should be safe)&lt;br /&gt;
* you use non-standard compiler settings (be careful about &#039;&#039;-march&#039;&#039;)!&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtaining the Source ==&lt;br /&gt;
{{Obtaining_The_Source_Code}}&lt;br /&gt;
&lt;br /&gt;
= Get Dependencies =&lt;br /&gt;
&lt;br /&gt;
To compile, you will have to install some development packages Spring depends on. These vary from distro to distro and may also depend on your specific configuration.&lt;br /&gt;
&lt;br /&gt;
If your distributions is not listed below, you should be able to figure out the correct package names from this.&lt;br /&gt;
&lt;br /&gt;
== Full list ==&lt;br /&gt;
* Programs necessary to build&lt;br /&gt;
** &#039;&#039;cmake&#039;&#039;&lt;br /&gt;
** &#039;&#039;7zip&#039;&#039; (aka &#039;&#039;p7zip&#039;&#039; or &#039;&#039;7z&#039;&#039;)&lt;br /&gt;
** The usual build toolchain&lt;br /&gt;
*** &#039;&#039;gcc&#039;&#039;&lt;br /&gt;
*** &#039;&#039;make&#039;&#039;&lt;br /&gt;
* Libraries&lt;br /&gt;
** SDL&lt;br /&gt;
** &#039;&#039;boost&#039;&#039; (version 1.35 or later)&lt;br /&gt;
*** &#039;&#039;threads&#039;&#039;&lt;br /&gt;
*** &#039;&#039;regex&#039;&#039;&lt;br /&gt;
*** &#039;&#039;signals&#039;&#039;&lt;br /&gt;
*** &#039;&#039;system&#039;&#039;&lt;br /&gt;
*** &#039;&#039;program-options&#039;&#039;&lt;br /&gt;
** &#039;&#039;libdeviL&#039;&#039; (IL)&lt;br /&gt;
** OpenAL (openal-soft, older openal-0.0.8 does not work)&lt;br /&gt;
** OpenGL headers (mesa, GLEW, etc.)&lt;br /&gt;
** &#039;&#039;zlib&#039;&#039;&lt;br /&gt;
** &#039;&#039;freetype&#039;&#039; (2)&lt;br /&gt;
** &#039;&#039;ogg&#039;&#039;, &#039;&#039;vorbis&#039;&#039; and &#039;&#039;vorbisfile&#039;&#039;&lt;br /&gt;
* Optional (for AI Interfaces and Skirmish AIs)&lt;br /&gt;
** &#039;&#039;python&#039;&#039; (2.5+)&lt;br /&gt;
** &#039;&#039;jdk&#039;&#039; (1.5+)&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
&lt;br /&gt;
For Etch (debian 4.0 stable) and Sid (debian unstable), I&#039;ve confirmed the&lt;br /&gt;
following to be the minimal set that is necessary to get. This works with Ubuntu 8.10, too.&lt;br /&gt;
As of ~ July 2009, spring depends on boost 1.35+ (if your distro is behind, you can try [https://launchpad.net/~pgquiles/+archive/ppa some unofficial backports]). &lt;br /&gt;
&lt;br /&gt;
Also, on 64-bit, be sure to build against DevIL 1.6.8-rc2+, as 1.6.7 has a bug in the PNG loading code that causes issues.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo aptitude install build-essential zlib1g-dev libfreetype6-dev cmake&lt;br /&gt;
sudo aptitude install libsdl1.2-dev libopenal-dev libglew-dev zip&lt;br /&gt;
sudo aptitude install libvorbis-dev libxcursor-dev libdevil-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-dev libboost-system1.37-thread-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-regex-dev &lt;br /&gt;
sudo aptitude install libboost-system1.37-serialization-dev&lt;br /&gt;
sudo aptitude install libboost-system1.37-program-options-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and cmake, depending on what you use for building (I advise to use cmake). On debian 5.0 (lenny), libglew1.5-dev is required as well.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu  ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# compiler and build tools&lt;br /&gt;
sudo apt-get install build-essential cmake cmake-gui git &lt;br /&gt;
&lt;br /&gt;
# spring dependencies&lt;br /&gt;
sudo apt-get install libglew-dev libsdl-dev libdevil-dev libopenal-dev \&lt;br /&gt;
 libogg-dev libvorbis-dev libfreetype6-dev p7zip-full libxcursor-dev \&lt;br /&gt;
 libboost-thread-dev libboost-regex-dev libboost-system-dev \&lt;br /&gt;
 libboost-program-options-dev libboost-signals-dev&lt;br /&gt;
&lt;br /&gt;
# alternatively, you can try ...&lt;br /&gt;
sudo apt-get build-dep spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... and that should install all the required dependencies (&#039;&#039;it should but it appears to be broken - SpliFF 2011-02-21&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
NOTE: On Ubuntu the CMake scripts currently don&#039;t detect FREETYPE_INCLUDE_DIR. You will need to set this by hand (using -DFREETYPE_INCLUDE_DIR=&amp;quot;/usr/include/freetype2/freetype&amp;quot; or by adding an &#039;advanced&#039; entry in cmake-gui).&lt;br /&gt;
(this problem is either not reproducible with Ubuntu 10.10, or not present in spring master anymore)&lt;br /&gt;
&lt;br /&gt;
to speed up compiling/linking, you can install gold, an alternative linker and an ccache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;sudo apt-get install binutils-gold ccache&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to make ccache useful, the cache size needs to be increased by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;ccache -M 5G&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to set it to 5GB.&lt;br /&gt;
&lt;br /&gt;
== Gentoo ==&lt;br /&gt;
This has been tested to work with a clean install of gentoo 2008.0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
emerge cmake \&amp;gt;=media-libs/freetype-2.0.0 \&amp;gt;=media-libs/libsdl-1.2.0&lt;br /&gt;
emerge media-libs/openal media-libs/glew dev-libs/boost&lt;br /&gt;
emerge app-arch/zip media-libs/libogg&lt;br /&gt;
USE=&amp;quot;png jpg tiff opengl&amp;quot; emerge media-libs/devil &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fedora ==&lt;br /&gt;
&lt;br /&gt;
On Fedora 8:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install cmake boost-devel openal-devel SDL-devel \&lt;br /&gt;
DevIL-devel glew-devel libvorbis-devel &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On Fedora 12-15:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gcc-c++ cmake boost-devel DevIL-devel freetype-devel \&lt;br /&gt;
glew-devel libvorbis-devel libXcursor-devel openal-devel SDL-devel p7zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Slackware ==&lt;br /&gt;
&lt;br /&gt;
On Slackware 13, cmake, ogg &amp;amp; vorbis, boost, glew and SDL already come with the full regular install, both libs and headers. You can find helper scripts to easily compile and package DevIL, OpenAL and spring itself [http://slackbuilds.org/ here].&lt;br /&gt;
&lt;br /&gt;
= Build And Install =&lt;br /&gt;
&lt;br /&gt;
== Using CMake (2.6 or newer) ==&lt;br /&gt;
Configure and build:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Default install paths are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/bin/spring&amp;lt;/code&amp;gt; Spring executable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/share/games/spring&amp;lt;/code&amp;gt; read-only data&lt;br /&gt;
&lt;br /&gt;
If you want &amp;lt;code&amp;gt;~/spring&amp;lt;/code&amp;gt; prefix instead of &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;, configure like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DCMAKE_INSTALL_PREFIX=~/spring .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
For further ways of customizing your build, have a look at the variables shown with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -LH .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ububtu 9.10 - if it cannot locate freetype include dir, then use:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake -DFREETYPE_INCLUDE_DIR=/usr .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you experience performance problems on multi-core systems, you may additionally build the MT version of spring:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And install with:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make install-spring-multithreaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other targets are: &amp;lt;code&amp;gt;spring-headless&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;spring-dedicated&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Troubleshooting_linux}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12373</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=12373"/>
		<updated>2013-02-15T15:15:35Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added arg for GetPlayerRoster&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;
&#039;&#039;&#039;Spring.IsReplay&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetReplayLength&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( ) -&amp;gt; nil | number (in gameframes)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSpectatingState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean spectating, boolean fullView, boolean fullSelect&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModUICtrl&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&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;
&#039;&#039;&#039;Spring.GetLocalPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playerID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number allyID&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerRoster&#039;&#039;&#039;&lt;br /&gt;
  ( [number sortType] | [number sortType], [bool showPathingPlayers] ) -&amp;gt;&lt;br /&gt;
    nil | 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;
   if pingTime is == -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;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;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;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamOrigColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerTraffic&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID [, number packetID] ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSoundStreamTime&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playedTime, number totalTime&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraNames&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [camName] = number camNum, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
&lt;br /&gt;
See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraPosition&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraDirection&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number forward_x, number forward_y, number forward_z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraFOV&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number fov&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraVectors&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&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;
  }&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleUnits&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 [, number radius = 30 [, boolean Icons = true ]]] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1 [, number radius = 30 [, boolean Icons = true [, boolean geos = true ]]]] )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAABBInView&#039;&#039;&#039;&lt;br /&gt;
  ( number minX, number minY, number minZ,&lt;br /&gt;
    number maxX, number maxY, number maxZ ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsSphereInView&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number radius ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInView&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number radius [, boolean checkIcons] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&#039;&#039;&#039;Spring.WorldToScreenCoords&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.TraceScreenRay&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseX, number mouseY [, boolean onlyCoords &lt;br /&gt;
  [, boolean useMinimap, [boolean includeSky]] ] )&lt;br /&gt;
    -&amp;gt; nil |&lt;br /&gt;
    string &amp;quot;unit&amp;quot;,    number unitID    |&lt;br /&gt;
    string &amp;quot;feature&amp;quot;, number featureID |&lt;br /&gt;
    string &amp;quot;ground&amp;quot;,  { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetViewGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number viewSizeX, number viewSizeY, number viewPosX, number viewPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWindowGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number winSizeX, number winSizeY, number winPosX, number winPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetScreenGeometry&#039;&#039;&#039; (is missing multiscreen support!)&lt;br /&gt;
  ( ) -&amp;gt; number screenSizeX, number screenSizeY, number ZERO, number ZERO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitViewPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean midPos = false ] ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransformMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean invert = false] ) -&amp;gt; nil | number a11, number a12 ..., number a44    &amp;lt;span class=note&amp;gt;(4x4 matrix)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = { [1] = [number unitID], etc...}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = number count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number count&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitSelected&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitGroup&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [number] = number unitCount,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedGroup&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIName&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; string aiName&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [1] = string aiName, ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = number unitID, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = {number unitID, ...}, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = number count, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGUIHidden&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveShadows&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveAdvShading&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWaterMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number mode, string &amp;quot;mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&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;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapDrawMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | &amp;quot;normal&amp;quot; | &amp;quot;height&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;pathTraversability&amp;quot; | &amp;quot;los&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit GUI States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoMinimap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number posX, number posY, number sizeX, number sizeY,&lt;br /&gt;
    boolean minimized, boolean maximized&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapDualScreen&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean false | string &amp;quot;left&amp;quot; | string &amp;quot;right&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAboveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDefaultCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&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;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number index ) -&amp;gt; nil | {&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;
&#039;&#039;&#039;Spring.GetCmdDescIndex&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActivePage&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number pageNum, number maxPages&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGatherMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetInvertQueueKey&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number X, number Y,&lt;br /&gt;
    boolean leftPressed, boolean middlePressed, boolean rightPressed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseCursor&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string name, number scale&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseButton ) -&amp;gt; nil | number pressedX, number pressedY,&lt;br /&gt;
    number camPosX, number camPosY, number camPosZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean alt, boolean ctrl, boolean meta, boolean shift&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPressedKeys&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [number] = boolean,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyCode&#039;&#039;&#039;&lt;br /&gt;
  ( string keysym ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeySymbol&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; string &amp;quot;keysym1&amp;quot;, string &amp;quot;keysym2&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyBindings&#039;&#039;&#039;&lt;br /&gt;
  ( string keyset ) -&amp;gt; nil | { [1] = {[string actionCmd] = string actionExtra}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActionHotKeys&#039;&#039;&#039;&lt;br /&gt;
  ( string action ) -&amp;gt; nil | { [1] = string hotKey, ... }&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastMessagePositions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = { number X, number Y, number Z },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConsoleBuffer&#039;&#039;&#039;&lt;br /&gt;
  ( [number maxLines] ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      text = string,&lt;br /&gt;
      priority = number&lt;br /&gt;
   }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCurrentTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFPS&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number low 16bit, number high 16bit&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimeOffset&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastUpdateSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHasLag&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTimer&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&#039;&#039;&#039;Spring.DiffTimers&#039;&#039;&#039;&lt;br /&gt;
  ( timer cur, timer ago) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  (number texSqrX, number texSqrY, number texMipLvl, string luaTexName) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12372</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=12372"/>
		<updated>2013-02-15T02:51:26Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added pathfindingprogress infos for GetPlayerRoster&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;
&#039;&#039;&#039;Spring.IsReplay&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetReplayLength&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( ) -&amp;gt; nil | number (in gameframes)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSpectatingState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean spectating, boolean fullView, boolean fullSelect&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModUICtrl&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&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;
&#039;&#039;&#039;Spring.GetLocalPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playerID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number allyID&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerRoster&#039;&#039;&#039;&lt;br /&gt;
  ( [number sortType] ) -&amp;gt;&lt;br /&gt;
    nil | 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;
   if pingTime is == -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) for the progress&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;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;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamOrigColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerTraffic&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID [, number packetID] ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSoundStreamTime&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playedTime, number totalTime&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraNames&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [camName] = number camNum, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
&lt;br /&gt;
See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraPosition&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraDirection&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number forward_x, number forward_y, number forward_z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraFOV&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number fov&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraVectors&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&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;
  }&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleUnits&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 [, number radius = 30 [, boolean Icons = true ]]] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1 [, number radius = 30 [, boolean Icons = true [, boolean geos = true ]]]] )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAABBInView&#039;&#039;&#039;&lt;br /&gt;
  ( number minX, number minY, number minZ,&lt;br /&gt;
    number maxX, number maxY, number maxZ ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsSphereInView&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number radius ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInView&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number radius [, boolean checkIcons] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&#039;&#039;&#039;Spring.WorldToScreenCoords&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.TraceScreenRay&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseX, number mouseY [, boolean onlyCoords &lt;br /&gt;
  [, boolean useMinimap, [boolean includeSky]] ] )&lt;br /&gt;
    -&amp;gt; nil |&lt;br /&gt;
    string &amp;quot;unit&amp;quot;,    number unitID    |&lt;br /&gt;
    string &amp;quot;feature&amp;quot;, number featureID |&lt;br /&gt;
    string &amp;quot;ground&amp;quot;,  { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetViewGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number viewSizeX, number viewSizeY, number viewPosX, number viewPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWindowGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number winSizeX, number winSizeY, number winPosX, number winPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetScreenGeometry&#039;&#039;&#039; (is missing multiscreen support!)&lt;br /&gt;
  ( ) -&amp;gt; number screenSizeX, number screenSizeY, number ZERO, number ZERO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitViewPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean midPos = false ] ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransformMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean invert = false] ) -&amp;gt; nil | number a11, number a12 ..., number a44    &amp;lt;span class=note&amp;gt;(4x4 matrix)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = { [1] = [number unitID], etc...}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = number count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number count&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitSelected&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitGroup&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [number] = number unitCount,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedGroup&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIName&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; string aiName&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [1] = string aiName, ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = number unitID, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = {number unitID, ...}, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = number count, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGUIHidden&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveShadows&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveAdvShading&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWaterMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number mode, string &amp;quot;mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&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;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapDrawMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | &amp;quot;normal&amp;quot; | &amp;quot;height&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;pathTraversability&amp;quot; | &amp;quot;los&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit GUI States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoMinimap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number posX, number posY, number sizeX, number sizeY,&lt;br /&gt;
    boolean minimized, boolean maximized&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapDualScreen&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean false | string &amp;quot;left&amp;quot; | string &amp;quot;right&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAboveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDefaultCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&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;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number index ) -&amp;gt; nil | {&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;
&#039;&#039;&#039;Spring.GetCmdDescIndex&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActivePage&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number pageNum, number maxPages&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGatherMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetInvertQueueKey&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number X, number Y,&lt;br /&gt;
    boolean leftPressed, boolean middlePressed, boolean rightPressed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseCursor&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string name, number scale&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseButton ) -&amp;gt; nil | number pressedX, number pressedY,&lt;br /&gt;
    number camPosX, number camPosY, number camPosZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean alt, boolean ctrl, boolean meta, boolean shift&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPressedKeys&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [number] = boolean,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyCode&#039;&#039;&#039;&lt;br /&gt;
  ( string keysym ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeySymbol&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; string &amp;quot;keysym1&amp;quot;, string &amp;quot;keysym2&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyBindings&#039;&#039;&#039;&lt;br /&gt;
  ( string keyset ) -&amp;gt; nil | { [1] = {[string actionCmd] = string actionExtra}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActionHotKeys&#039;&#039;&#039;&lt;br /&gt;
  ( string action ) -&amp;gt; nil | { [1] = string hotKey, ... }&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastMessagePositions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = { number X, number Y, number Z },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConsoleBuffer&#039;&#039;&#039;&lt;br /&gt;
  ( [number maxLines] ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      text = string,&lt;br /&gt;
      priority = number&lt;br /&gt;
   }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCurrentTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFPS&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number low 16bit, number high 16bit&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimeOffset&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastUpdateSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHasLag&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTimer&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&#039;&#039;&#039;Spring.DiffTimers&#039;&#039;&#039;&lt;br /&gt;
  ( timer cur, timer ago) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  (number texSqrX, number texSqrY, number texMipLvl, string luaTexName) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:trouble&amp;diff=7341</id>
		<title>FAQ:trouble</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:trouble&amp;diff=7341"/>
		<updated>2011-06-21T21:35:45Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: spring allows midgame join since almost 1 year&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ]]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Network==&lt;br /&gt;
&lt;br /&gt;
===My buddy can not connect to a game I&#039;ve opened. What can we do?===&lt;br /&gt;
The engine uses UDP port 8452 by default, which can be changed in the lobby. If you are behind a router, and are having problems hosting, try forwarding the correct port and also make sure the firewall is not blocking it. If you do not know what a port or a firewall is, use a relay host instead: when hosting a game, tick the check-box labeled &amp;quot;Use relayhost&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Graphics==&lt;br /&gt;
&lt;br /&gt;
===I am having really bad framerates (fps) on my dual core! What am I doing wrong?===&lt;br /&gt;
Some of this helped other users:&lt;br /&gt;
&lt;br /&gt;
* This error is sometimes reported by people having multicore-CPUs. To solve this, you could try to restrict it to run on one core. Enable &amp;quot;SetCoreAffinity=1&amp;quot; in your springsettings.cfg or ~/.springrc.&lt;br /&gt;
* Installing the latest processor drivers and Windows hotfixes for your system may also help.&lt;br /&gt;
* Also you may try multithreaded version of Spring, which comes with the installation pack labeled as &#039;Multi-threaded executable&#039; option. &amp;lt;span class=warning&amp;gt;WARNING: `multithreaded` means something different in this context than 99.9% of the ppl think!!! Also this engine version is LESS STABLE and is known to not work with most Lua widgets!!!&amp;lt;/span&amp;gt;&lt;br /&gt;
* Also try to disabling the &amp;quot;Exhaust&amp;quot; effect on planes could help: Press f11 while ingame, disable LUPS and Lups manager (by clicking on them to make them turn red)&lt;br /&gt;
&lt;br /&gt;
===How to Alt-Tab out of full-screen on Linux?===&lt;br /&gt;
Play windowed with &#039;&#039;/grabinput&#039;&#039;, or [http://springrts.com/phpbb/viewtopic.php?p=449972#p449972 use devilspie].&lt;br /&gt;
&lt;br /&gt;
===I use Linux with Open-Source Gfx drivers, and the map is all white!===&lt;br /&gt;
Due to patents S3TC texture support is disabled by default. To enable it you need the tool driconf (note, you no longer require libdxtn):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install libgl1-mesa-dev driconf&amp;lt;br&amp;gt;&lt;br /&gt;
$ driconf&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the &amp;quot;Image Quality&amp;quot; tab activate &amp;quot;Enable S3TC texture compression even if software support is not available&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=20&amp;amp;t=20809 Spring on Intel or ATI &#039;open-source&#039; drivers]&lt;br /&gt;
&lt;br /&gt;
===It crashes, hangs, ...===&lt;br /&gt;
Possible fixes are: &lt;br /&gt;
* updating your graphics driver&lt;br /&gt;
* lowering the graphic-settings at SpringSettings&lt;br /&gt;
* disabling graphics effects at SpringSettings&lt;br /&gt;
&lt;br /&gt;
===Nvidia===&lt;br /&gt;
&lt;br /&gt;
====Nvidia: I am having really bad framerates (FPS)!====&lt;br /&gt;
Turn off &#039;threaded optimizations&#039; for Spring in the nVidia control panel, enable &amp;quot;Compress textures&amp;quot; in SpringSettings.&lt;br /&gt;
&lt;br /&gt;
====It crashes====&lt;br /&gt;
&lt;br /&gt;
try disabling shadows (SpringSettings)&lt;br /&gt;
&lt;br /&gt;
===Intel===&lt;br /&gt;
&lt;br /&gt;
====Why does spring hang for a few seconds?====&lt;br /&gt;
This bug occurs on maps like FolsomDamDeluxeV2, Tangerline. FPS suddenly drops to 1 and game runs very slowly. This seems to be an Intel driver bug. For Windows Vista/7 try updating driver up to 8.15.10.2246 or newer. For Windows XP there is no solution yet.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23541 Intel HD Graphics Driver issue?]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23081 Performance issues on Intel X4500]&lt;br /&gt;
&lt;br /&gt;
====Fonts are unreadable====&lt;br /&gt;
[[File:IntelBorkedFonts.png|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a driver bug, try to update/downgrade your driver.&lt;br /&gt;
&lt;br /&gt;
====It crashes, hangs etc...====&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* disabling texture-compression at SpringSettings&lt;br /&gt;
* disabling reflective units at SpringSettings&lt;br /&gt;
* [http://downloadcenter.intel.com/ updating your driver]&lt;br /&gt;
* use linux! (yes, this hint sucks, but the open-source-drivers seems to work better...)&lt;br /&gt;
&lt;br /&gt;
===ATI/AMD===&lt;br /&gt;
First of all, if you encourage a graphics related problem on ATI/AMD graphic device update your drivers to the latest version [http://support.amd.com/us/gpudownload/Pages/index.aspx ATI/AMD dowload].&lt;br /&gt;
&lt;br /&gt;
==== I&#039;ve got the most recent drivers and the game crashes in atioglxx.dll====&lt;br /&gt;
As of Spring 0.80.5, use only basic or dynamic water. Bump water with disabled shore waves should also work. Reflective or refractive water will make the game crash after 15-20 minutes due to a memory leak.&lt;br /&gt;
&lt;br /&gt;
Spring 0.81.2 and/or Catalyst 10.2 drivers or newer should fix this problem.&lt;br /&gt;
&lt;br /&gt;
if the game crashes immediatly after the loading screen is finished (&amp;quot;Finalizing&amp;quot;) in the Zero-K or Gundam mods and the video card is based on the RV670 GPU (some models of: 3690, 3850, 3870, 4570, 4730, 3730, 3610, 4580, 4750, 3750, 2600 XT/PRO, 3830) Catalyst 8.12 drivers may fix it (windows xp 32-bit, possibly other NT5-based 32-bit platforms), however even with that driver there may still be a crash (not immediatly after the loading screen, as soon as the simulations starts) in Annihilation-based mods that use RED UI, the same lua-based atioglxx.dll crash also happens with the 1944 mod.&lt;br /&gt;
&lt;br /&gt;
also note that later versions of Catalyst drivers for these cards reduce performance in OpenGL applications (windows xp 32-bit, possibly other NT5-based 32-bit platforms) (found at least in: spring, quake3 and Nexuiz), for spring the most significant drop (by ~15%) appears in 9.10 and higher Catalyst versions (more than 15%), if you have one of the lower-performing models of these and don&#039;t use shadows you may want to try the Catalyst 8.3 and 8.4 drivers (they do not support shadows but should work ~5% faster compared to 8.12) but those drivers may be less stable&lt;br /&gt;
&lt;br /&gt;
====I&#039;ve got a notebook and official ATI/AMD drivers refuse to install, what to do?====&lt;br /&gt;
First of all, make sure you&#039;re installing the &#039;AMD Mobility Radeon&#039; driver pack branch.&lt;br /&gt;
Use [http://www.driverheaven.net/modtool.php ATI Mobility Modder] or unofficial drivers - DNA or Omega. Use [http://google.com Google] or get them from [http://downloads.guru3d.com/Videocards----ATI-Catalyst-(Modified)_c24.html guru3d].&lt;br /&gt;
&lt;br /&gt;
====UI disapears after 5-10 mins of play on old ATI videocards====&lt;br /&gt;
In cmdcolors.txt, simply comment out or remove the following lines:&lt;br /&gt;
 stipplePattern 0xffcc&lt;br /&gt;
 stippleFactor 1&lt;br /&gt;
 stippleSpeed 1.0&lt;br /&gt;
The problem detected on:&lt;br /&gt;
* ATI Radeon X3200 with latest drivers ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=20817 ref])&lt;br /&gt;
* ATI Radeon 9500 with Omega drivers 3.8.442 ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23526 ref])&lt;br /&gt;
&lt;br /&gt;
====I see the complete screen full of red/green/yellow or giant dots on minimap====&lt;br /&gt;
&lt;br /&gt;
[[File:Redui-minimap-bug.pngâ€Ž|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a bug somewhere in LUA drawing with ATI/AMD. Disable widgets that draw via F11 menu to find the one. There is no real fix. A Widget causing this is &amp;quot;Red UI Minimap&amp;quot;. Setting &amp;quot;Max nano simultaneous particles&amp;quot; (SpringSettings) seems to help, too.&lt;br /&gt;
&lt;br /&gt;
====The textures looks scary====&lt;br /&gt;
[[File:Ati-drawing-issues.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a known ATI/AMD-bug. Try using different driver, preferably other than 10.5, 10.6, 10.7 -&amp;gt; newer driver pack with fixed OpenGL driver should be fine.&lt;br /&gt;
&lt;br /&gt;
====It crashes always at start, hangs etc...====&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* using basic water (SpringSettings)&lt;br /&gt;
* disabling vsync (SpringSettings)&lt;br /&gt;
* disabling Pixelbuffer objects (SpringSettings)&lt;br /&gt;
* disabling Anti-Aliasing (SpringSettings)&lt;br /&gt;
* updating or even downgrading [http://support.amd.com/ ATI driver]: ATI/AMD OpenGL drivers are very buggy, blame ATI/AMD for that!&lt;br /&gt;
* set AtiHacks=1 (~/.springrc or springsettings.cfg)&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
&lt;br /&gt;
===The Sound is crackling/pausing in Windows, what can i do?===&lt;br /&gt;
Try:&lt;br /&gt;
* Update the sounds driver&lt;br /&gt;
* Enable SystemSoundsService in Vista/Seven&lt;br /&gt;
&lt;br /&gt;
===I am having sound problems under Linux! What can i do?===&lt;br /&gt;
In more then 90% of the cases, this is caused by PulseAudio. If this is the problem, there are two known solutions to solve it. Use one of them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;disable non-ALSA (preferred)&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure you have the OpenAL-Soft configuration utility. You might want to run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# install&lt;br /&gt;
sudo apt-get install alsoft-conf&lt;br /&gt;
# run&lt;br /&gt;
alsoft-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;backend&amp;quot; tab, keep only &amp;quot;ALSA&amp;quot; on the left column, then save. Done!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Side Note:&#039;&#039; ALSA is redirected to the PulseAudio layer when installed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;remove PulseAudio (alternative)&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can safely remove PulseAudio from your system. To do this, open your favorite package manager (eg. Synaptic under Ubuntu), and search for packages with &amp;quot;pulse&amp;quot; in their name. From these, keep only the ones with names that start with &amp;quot;lib&amp;quot;, and remove all others.&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
===I have a problem that is not described here! What can i do?===&lt;br /&gt;
There is a number of things you can do, among these are:&lt;br /&gt;
* Search in the [http://springrts.com/phpbb/viewforum.php?f=11 Help &amp;amp; Bugs Forum], and ask if you can not find a suiting topic.&lt;br /&gt;
* Look at the [[Gentoo_install#Linux_specific_Troubleshooting|Linux only FAQ]].&lt;br /&gt;
* Ask for help in the lobby in a suiting channel, eg: #springlobby, #de, #fr, #ai, #main&lt;br /&gt;
* Ask the FAQ-Bot in the lobby in channel #springlobby. To get a list of topics, write &#039;&#039;!faqlist&#039;&#039; and then use &#039;&#039;!faq &amp;lt;topic-name&amp;gt;&#039;&#039; to get the help text. For example, try &#039;&#039;!faq rename&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10965</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10965"/>
		<updated>2011-06-19T14:47:17Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added GameProgress&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;
===Lua Call-Ins, with parameters===&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-size:90%&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Here are the known reserved parameter values for all Lua Call-Ins.  If you add new Call-Ins to Spring, please document them here.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MapDrawCmd()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, cmdType, px, py, pz, label&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;button parameter values: left - 1, middle - 2, right - 3&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;Please note that in order to have Spring call MouseRelease, you need to have a MousePress call-in in the same widget that returns true.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MapDrawCmd()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, cmdType, px, py, pz, labeltext&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, builderID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, attackerID?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdOpts, cmdParams&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
* Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameProgress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;serverFrameNum&amp;quot; ( called every 60 frames, calculating delta between GameFrame and GameProgress can give an ETA about catching up with simulation )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; New in 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt;  &amp;quot;[ [1] = allyTeamID1, [2] = allyTeamID2, ... ]&amp;quot;,  a list of winning allyteams, if empty the game result was undecided ( like when dropping from an host )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;   Will return nil in pre 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowStartPosition()&amp;lt;/font&amp;gt; --&amp;gt; nobody cares&amp;lt;br&amp;gt;&lt;br /&gt;
returns nobody cares&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==What is a callin anyway?==&lt;br /&gt;
Call-ins are calls from the engine, into the gadget or widget script. In other words, these functions are called when a particular â€œeventâ€ happens.&lt;br /&gt;
Some call-in functions can return values to the engine.&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;br /&gt;
&lt;br /&gt;
==Blocking events with return values:==&lt;br /&gt;
The call-in functions named &#039;&#039;&#039;&#039;&#039;Allow&#039;&#039;&#039;&#039;&#039;XXX can block their event by returning false.&amp;lt;br&amp;gt;&lt;br /&gt;
For example &#039;&#039;AllowUnitTransfer()&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return true&amp;lt;/code&amp;gt; = allow transfer &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;return false&amp;lt;/code&amp;gt; = deny transfer&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5994</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5994"/>
		<updated>2011-01-20T23:49:52Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: Spring Engine Updates -&amp;gt; Spring Engine ( no games included )&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#css:&lt;br /&gt;
  #content * {font-family: &#039;Bitstream Vera Sans&#039;,  &#039;Trebuchet MS&#039;, &#039;Arial&#039;, &#039;Myriad Pro&#039;, &#039;FreeSans&#039;;}&lt;br /&gt;
}}&lt;br /&gt;
= Downloads =&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|style=&amp;quot;margin-top: 15px; padding: 10px; background:rgba(45,180,19,0.5); border: 1px solid rgba(0,0,0,0.5); border-radius: 6px 6px 6px 6px; box-shadow: 0 2px 6px rgba(0,0,0,0.3), inset 0 1px 2px rgba(255,255,255,0.5), inset 0 10px 8px rgba(255,255,255,0.3);&amp;quot; |&lt;br /&gt;
| If you just want to &amp;lt;u&amp;gt;get ready to play&amp;lt;/u&amp;gt;, you want this:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;margin-top: 15px; text-align: center&amp;quot; | &amp;lt;span style=&amp;quot;font-size: 150%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;[[GamesDownloads|Games Downloads]]&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Spring Engine (no games included) =&lt;br /&gt;
Latest stable version is: &#039;&#039;&#039;{{StableEngineVersion}}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Window.png]]&lt;br /&gt;
| &#039;&#039;&#039;Installer: [http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}.exe/download spring_{{StableEngineVersion}}.exe ~21MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}.exe {mirror}]&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Portable: [http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}_portable.7z/download spring_{{StableEngineVersion}}_portable.7z ~18MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}portable.7z {mirror}]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Tux-G2.pngâ€Ž]]&lt;br /&gt;
| follow the &#039;&#039;&#039;[[SetupGuide|Linux Setup guide]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Apple.png]]&lt;br /&gt;
| &#039;&#039;&#039; &#039;&#039;No download yet&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
The Mac OS X port is rough and unfinished. Help with its development would be greatly appreciated. More information on the current state of this port can be found &#039;&#039;&#039;[[Spring_on_MacOSX|&amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;here&amp;lt;/span&amp;gt;]]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Testing/Nightly Builds =&lt;br /&gt;
Used for testing latest engine developments.&lt;br /&gt;
[http://springrts.com/dl/buildbot/ list of all test builds]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
== git ==&lt;br /&gt;
&#039;&#039;&#039;[http://github.com/spring/spring &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring project page at github&amp;lt;/span&amp;gt;]&#039;&#039;&#039; &amp;lt;small&amp;gt;[http://status.github.com (status page)]&amp;lt;/small&amp;gt;&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/spring.git&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This however gives you the bleeding edge, if you want to play online then run:&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout {{StableEngineVersion}}&amp;lt;/code&amp;gt;&lt;br /&gt;
from within the source directory. This will provide the correct source code&lt;br /&gt;
=== Alternate git url ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git://springrts.git.sourceforge.net/gitroot/springrts/springrts&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Latest Stable Snapshot ==&lt;br /&gt;
This tarball is the same as that used to build the last public release. See [[Building spring]] for build instructions.&lt;br /&gt;
&lt;br /&gt;
The packages below target Linux only and do not contain certain files required to compile using CMake on Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}_src.tar.lzma/download spring_{{StableEngineVersion}}_src.tar.lzma]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}_src.tar.lzma {mirror}]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}_src.tar.gz/download spring_{{StableEngineVersion}}_src.tar.gz]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}_src.tar.gz {mirror}]&lt;br /&gt;
&lt;br /&gt;
= Other springrts.com hosted projects =&lt;br /&gt;
== TASClient ==&lt;br /&gt;
An alternative windows only lobby client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/tasclient/TASClientLatest.7z Download TASClient]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lobby server==&lt;br /&gt;
If you do not want (or are unable) to use the public lobby server, you can download the server software here to run your own. See the readme &#039;&#039;&#039;[http://springrts.com/dl/tasserver_readme.txt here]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/TASServer.jar Click here to download]&#039;&#039;&#039; 100.7kb, added 2008-03-02 (requires Java Runtime Environment)&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5993</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5993"/>
		<updated>2010-09-14T21:10:27Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: Removed deprecated selection editor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#css:&lt;br /&gt;
  #content * {font-family: &#039;Bitstream Vera Sans&#039;,  &#039;Trebuchet MS&#039;, &#039;Arial&#039;, &#039;Myriad Pro&#039;, &#039;FreeSans&#039;;}&lt;br /&gt;
}}&lt;br /&gt;
= Downloads =&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|style=&amp;quot;margin-top: 15px; padding: 10px; background:rgba(45,180,19,0.5); border: 1px solid rgba(0,0,0,0.5); border-radius: 6px 6px 6px 6px; box-shadow: 0 2px 6px rgba(0,0,0,0.3), inset 0 1px 2px rgba(255,255,255,0.5), inset 0 10px 8px rgba(255,255,255,0.3);&amp;quot; |&lt;br /&gt;
| If you just want to &amp;lt;u&amp;gt;get ready to play&amp;lt;/u&amp;gt;, you want this:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;margin-top: 15px; text-align: center&amp;quot; | &amp;lt;span style=&amp;quot;font-size: 150%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;[[GamesDownloads|Games Downloads]]&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Spring Engine Updates =&lt;br /&gt;
Latest stable version is: &#039;&#039;&#039;{{StableEngineVersion}}&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Window.png]]&lt;br /&gt;
| &#039;&#039;&#039;Installer: [http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}.exe/download spring_{{StableEngineVersion}}.exe ~21MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}.exe {mirror}]&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Portable: [http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}_portable.7z/download spring_{{StableEngineVersion}}_portable.7z ~18MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}portable.7z {mirror}]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Tux-G2.pngâ€Ž]]&lt;br /&gt;
| follow the &#039;&#039;&#039;[[SetupGuide|Linux Setup guide]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Apple.png]]&lt;br /&gt;
| &#039;&#039;&#039; &#039;&#039;No download yet&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
The Mac OS X port is rough and unfinished. Help with its development would be greatly appreciated. More information on the current state of this port can be found &#039;&#039;&#039;[[Spring_on_MacOSX|&amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;here&amp;lt;/span&amp;gt;]]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Testing/Nightly Builds =&lt;br /&gt;
Used for testing latest engine developments.&lt;br /&gt;
[http://springrts.com/dl/buildbot/ list of all test builds]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
== git ==&lt;br /&gt;
&#039;&#039;&#039;[http://github.com/spring/spring &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring project page at github&amp;lt;/span&amp;gt;]&#039;&#039;&#039; &amp;lt;small&amp;gt;[http://status.github.com (status page)]&amp;lt;/small&amp;gt;&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/spring.git&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This however gives you the bleeding edge, if you want to play online then run:&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout {{StableEngineVersion}}&amp;lt;/code&amp;gt;&lt;br /&gt;
from within the source directory. This will provide the correct source code&lt;br /&gt;
=== Alternate git url ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git://springrts.git.sourceforge.net/gitroot/springrts/springrts&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Latest Stable Snapshot ==&lt;br /&gt;
This tarball is the same as that used to build the last public release. See [[Building spring]] for build instructions.&lt;br /&gt;
&lt;br /&gt;
The packages below target Linux only and do not contain certain files required to compile using CMake on Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}_src.tar.lzma/download spring_{{StableEngineVersion}}_src.tar.lzma]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}_src.tar.lzma {mirror}]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-{{StableEngineVersion}}/spring_{{StableEngineVersion}}_src.tar.gz/download spring_{{StableEngineVersion}}_src.tar.gz]&#039;&#039;&#039; - [http://springrts.com/dl/spring_{{StableEngineVersion}}_src.tar.gz {mirror}]&lt;br /&gt;
&lt;br /&gt;
= Other springrts.com hosted projects =&lt;br /&gt;
== TASClient ==&lt;br /&gt;
An alternative windows only lobby client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/tasclient/TASClientLatest.7z Download TASClient]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lobby server==&lt;br /&gt;
If you do not want (or are unable) to use the public lobby server, you can download the server software here to run your own. See the readme &#039;&#039;&#039;[http://springrts.com/dl/tasserver_readme.txt here]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/TASServer.jar Click here to download]&#039;&#039;&#039; 100.7kb, added 2008-03-02 (requires Java Runtime Environment)&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10955</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10955"/>
		<updated>2010-09-09T22:01:04Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added info about GameOver call-in&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;
===Lua Call-Ins, with parameters===&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-size:90%&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Here are the known reserved parameter values for all Lua Call-Ins.  If you add new Call-Ins to Spring, please document them here.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MapDrawCmd()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, cmdType, px, py, pz, label&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MapDrawCmd()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;playerID, cmdType, px, py, pz, labeltext&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot; ... I hope that&#039;s self-explanatory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, attackerID?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdOpts, cmdParams&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
* Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt;  &amp;quot;[ [1] = allyTeamID1, [2] = allyTeamID2, ... ]&amp;quot;,  a list of winning allyteams, if empty the game result was undecided ( like when dropping from an host )&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;   Will return nil in pre 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11700</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=11700"/>
		<updated>2010-09-09T21:56:23Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: Added doc about new call-out to handle game end&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;
&#039;&#039;&#039;Spring.KillTeam&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; New in version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units )&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GameOver&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; New in version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( [ [1] = allyTeamID1, [2] = allyTeamID2, .. ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&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&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.UseTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, &lt;br /&gt;
    string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;,number amount |&lt;br /&gt;
    { metal = number amount, energy = number amount}&lt;br /&gt;
  ) -&amp;gt; nil | boolean hadEnough&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string res, number amount ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for res are:&lt;br /&gt;
    &amp;quot;m&amp;quot;  = metal&lt;br /&gt;
    &amp;quot;e&amp;quot;  = energy&lt;br /&gt;
    &amp;quot;ms&amp;quot;  = metal storage&lt;br /&gt;
    &amp;quot;es&amp;quot;  = energy storage&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamShareLevel&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ShareTeamResource&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID_src, number teamID_recv, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateUnit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: offmap positions are clamped! (you still can use MoveCtrl todo so)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number unitDefID,&lt;br /&gt;
    number x, number y, number z,&lt;br /&gt;
    (number facing | string &amp;quot;facing&amp;quot;),&lt;br /&gt;
    number teamID,&lt;br /&gt;
    [boolean build = false] ) -&amp;gt; number unitID&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
  if build is true the unit is created in &amp;quot;being built&amp;quot; state, with buildProgress = 0&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    [boolean selfd = false,]&lt;br /&gt;
    [boolean reclaimed = false,]&lt;br /&gt;
    [number attackerID] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
 selfd := makes the unit act like it self-destructed&lt;br /&gt;
 reclaimed := don&#039;t show any DeathSequences, don&#039;t leave a wreckage.&lt;br /&gt;
   NOTE this does _not_ give back the resources to the team!&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    numer newTeamID,&lt;br /&gt;
    [boolean given = true] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;if given=false, the unit is captured&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCosts&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, { &lt;br /&gt;
     [ buildTime  = number amount ],&lt;br /&gt;
     [ metalCost  = number amount ],&lt;br /&gt;
     [ energyCost = number amount ]&lt;br /&gt;
   } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;tooltip&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number health |&lt;br /&gt;
    { [ health   = number health ],&lt;br /&gt;
      [ capture  = number capture ],&lt;br /&gt;
      [ paralyze = number paralyze ],&lt;br /&gt;
      [ build    = number build ] }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMaxHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number maxHealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitDamage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number damage&lt;br /&gt;
    [, number paralyze = 0 [, number attackerID = -1 [, number weaponID = -1&lt;br /&gt;
      [, number impulse_x [, number impulse_y [, number impulse_z ]]] ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number stockpile [, number buildPercent ]]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number experience ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number fuel ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID, number teamID [, boolean isRoot] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean neutral ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number enemyUnitID | number x, number y, number z,&lt;br /&gt;
    [ boolean dgun = false ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitBlocking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean blocking [, boolean collide ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number depth [,number range] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitBuildSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number builderID,&lt;br /&gt;
    number buildSpeed, [ number repairSpeed [, number reclaimSpeed&lt;br /&gt;
  [,number resurrectSpeed [, number captureSpeed [, number terraformSpeed ]] ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitArmored&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean armored ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean enabled [, number power] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot;, number mode ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;moveFactor&amp;quot;, number factor) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;minDamage&amp;quot;, number minDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;mazDamage&amp;quot;, number maxDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot;, number x, number y, number z) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum, table states ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&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;aimReady&amp;quot; = number value,] &amp;lt;span class=note&amp;gt;(&amp;lt;&amp;gt;0.0f := true)&amp;lt;/span&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&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_TYPE_FOOTPRINT, // intersection of sphere and footprint-prism&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;
&#039;&#039;&#039;Spring.SetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceIndex, boolean affectLocal, boolean affectGlobal,&lt;br /&gt;
    boolean enableLocal, boolean enableGlobal, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number travel [, number travelPeriod] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMoveGoal&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;used by default commands to get in build-,attackrange etc.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number x, number y, number z,&lt;br /&gt;
    [, number radius = 0 [, number speed = unit-&amp;gt;maxSpeed * 2 ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPhysics&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number posx, number posy, number posz,&lt;br /&gt;
    number velx, number vely, number velz,&lt;br /&gt;
    number rotx, number roty, number rotz,&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number x, number z [, boolean alwaysAboveSea] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number velx, number vely, number velz ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitRotation&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number rotx, number roty, number rotz ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitImpulse&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitSeismicPing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pingSize ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveBuildingDecal&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCloak&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    boolean cloaked | number scriptCloak,&lt;br /&gt;
    [ number decloakDistance | boolean decloakAbs ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  If the 2nd argument is a number, the value works like this:&lt;br /&gt;
   1:=normal cloak&lt;br /&gt;
   2:=for free cloak (cost no E)&lt;br /&gt;
   3:=for free + no decloaking (except the unit is stunned)&lt;br /&gt;
   4&amp;gt;=ultimative cloak (no ecost, no decloaking, no stunned decloak)&lt;br /&gt;
&lt;br /&gt;
  The decloak distance is only changed if the 3th argument is a number or a boolean.&lt;br /&gt;
   If the boolean is false it takes the default decloak distance for that unitdef,&lt;br /&gt;
   if the boolean is true it takes the absolute value of it.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSonarStealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean sonarStealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitStealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean stealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean alwaysVisible ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLosMask&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number allyTeam, number los | table losTypes ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;the 3th argument is either the bit-and combination of the following numbers:&lt;br /&gt;
  LOS_INLOS     = 1&lt;br /&gt;
  LOS_INRADAR   = 2&lt;br /&gt;
  LOS_PREVLOS   = 4&lt;br /&gt;
  LOS_CONTRADAR = 8&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;or a table of the following form:&lt;br /&gt;
  losTypes = {&lt;br /&gt;
    [los = boolean,]&lt;br /&gt;
    [radar = boolean,]&lt;br /&gt;
    [prevLos = boolean,]&lt;br /&gt;
    [contRadar = boolean,]&lt;br /&gt;
  }&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLosState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number allyTeam, number los | table losTypes ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;see above for more info on the arguments&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type, number radius ) -&amp;gt; nil | number newRadius&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;type can be:&lt;br /&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;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unit Ressourcing ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitResourcing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    string res, number amount |&lt;br /&gt;
    { res = number amount, ... }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for res are: &amp;quot;[u|c][u|m][m|e]&amp;quot;&lt;br /&gt;
       unconditional | conditional&lt;br /&gt;
                 use | make&lt;br /&gt;
               metal | energy&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UseUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil | boolean okay&lt;br /&gt;
  ( number unitID, { [&amp;quot;m&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;e&amp;quot; | &amp;quot;energy&amp;quot;] = amount, ... } ) -&amp;gt; nil | boolean okay&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateFeature&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number featureID, number x, number y, number z&lt;br /&gt;
   [,number heading [, number AllyTeamID ]] ) -&amp;gt; number featureID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number health) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureReclaim&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number reclaimLeft) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, string &amp;quot;UnitDefName?&amp;quot; [, number facing | string &amp;quot;facing&amp;quot; ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z [, boolean snapToGround]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitCollisionVolumeData for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&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;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&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;
    [ 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;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade&lt;br /&gt;
   &amp;lt;font color=#55ee99&amp;gt;[, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]]&amp;lt;/font&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
   it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
   If this integer differs from the one before the experience change&lt;br /&gt;
   it will call UnitExperience().&lt;br /&gt;
  Also those 3 last params are only available in .cheat&lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot;,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=11913</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=11913"/>
		<updated>2010-09-09T21:46:26Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added warning about deprecated functions&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;
=== 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;(those special TeamIDs are not supported by all functions)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALL_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.MY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALLY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ENEMY_UNITS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGaiaTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGodModeEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsCheatingEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsDevLuaEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsEditDefsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.AreHelperAIsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FixedAllies&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGameOver&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Rules ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Those functions allow to save data per Game,Team and Unit.&amp;lt;br&amp;gt;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;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRulesInfoMap&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;REMOVED in 0.82!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; { [key1] = string value1, [key2] = string value2, ... }&lt;br /&gt;
  ( string &amp;quot;key&amp;quot; ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number ruleIndex | string ruleName ) -&amp;gt; number value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number value1}, [ruleIndex2] = {[ruleName2] = number value2}, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number index | string ruleName ) -&amp;gt; nil | number value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number value1}, [ruleIndex2] = {[ruleName2] = number value2}, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number index | string ruleName ) -&amp;gt; nil | number value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number value1}, [ruleIndex2] = {[ruleName2] = number value2}, ... }&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number frameNum%dayFrames, number frameNum/dayFrames&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWind&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number dirX, number dirY, number dirZ, &lt;br /&gt;
         number strength,  number normDirX, number normDirY, number normDirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHeadingFromVector&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVectorFromHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number heading ) -&amp;gt; number x, number z&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSideData&#039;&#039;&#039;&lt;br /&gt;
  ( string sideName ) -&amp;gt; nil | string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( number sideID ) -&amp;gt; nil | string sideName, string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( ) -&amp;gt; { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamStartBox&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID ) -&amp;gt; nil | number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerList&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])&lt;br /&gt;
  -&amp;gt; nil | { [1] = number playerID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1] ) -&amp;gt; nil | { [1] = number teamID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number allyTeamID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; &lt;br /&gt;
    nil | string  &amp;quot;name&amp;quot;,  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(in synced code this is &amp;quot;SYNCED_NONAME&amp;quot;!)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean active,&lt;br /&gt;
          boolean spectator,&lt;br /&gt;
          number  teamID,&lt;br /&gt;
          number  allyTeamID,&lt;br /&gt;
          number  pingTime,&lt;br /&gt;
          number  cpuUsage,&lt;br /&gt;
          string  country,&lt;br /&gt;
          number  rank&lt;br /&gt;
          table   customPlayerKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerControlledUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAIInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; &lt;br /&gt;
    nil | &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;number  teamID, (bug in pre 0.82)&amp;lt;/span&amp;gt;&lt;br /&gt;
          number  skirmishAIID,&lt;br /&gt;
          string  name,&lt;br /&gt;
          number  hostingPlayerID,&lt;br /&gt;
          string  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;&lt;br /&gt;
          string  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;&lt;br /&gt;
          table   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;
&#039;&#039;&#039;Spring.GetAllyTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number allyteamID ) -&amp;gt; nil | table   customTeamKeys&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number  teamID,&lt;br /&gt;
          number  leader, &amp;lt;span class=note&amp;gt;(:= a player id)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean isDead,&lt;br /&gt;
          boolean isAiTeam,&lt;br /&gt;
          string  &amp;quot;side&amp;quot;,&lt;br /&gt;
          number  allyTeam&lt;br /&gt;
          table   customTeamKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResources&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number currentLevel,&lt;br /&gt;
          number storage,&lt;br /&gt;
          number pull,&lt;br /&gt;
          number income,&lt;br /&gt;
          number expense,&lt;br /&gt;
          number share,&lt;br /&gt;
          number sent,&lt;br /&gt;
          number received&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitStats&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number killed,&lt;br /&gt;
          number died,&lt;br /&gt;
          number capturedBy,&lt;br /&gt;
          number capturedFrom,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResourceStats&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID,  string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number used,&lt;br /&gt;
          number produced,&lt;br /&gt;
          number excessed,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStatsHistory&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID [, number startIndex [, number endIndex = startIndex ]]) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number cur_max_index |&lt;br /&gt;
    {&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;
   }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamLuaAI&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; string &amp;quot;luaAI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&#039;&#039;&#039;Spring.AreTeamsAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID1, number teamID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ArePlayersAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID1, number playerID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil |&lt;br /&gt;
    unitDefTable = {&lt;br /&gt;
      [number unitDefID] = { [1] = [number unitID], etc... },&lt;br /&gt;
      etc...&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | countTable = { [number unitDefID] = count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsByDefs&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID | { number unitDefID1, ... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitDefCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID ) -&amp;gt; nil | number count&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) &lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInBox&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number ymin, number zmin,&lt;br /&gt;
    number xmax, number ymax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInPlanes&#039;&#039;&#039;&lt;br /&gt;
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  plane normals point towards accepted space,&lt;br /&gt;
  so the acceptance criteria for each plane is:&lt;br /&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&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestAlly&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range ] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestEnemy&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range [, bool useLOS]] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&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;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the center position of the unit (midpos).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(returns the distance of 2 units)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D ] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&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;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&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;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Consider this broken. It returns reverse direction in piece space (i.e. vertex(0)-vertex(1)) for pieces with &amp;gt;= 2 vertices and (1,1,1) for pieces with &amp;lt; 2 vertices)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&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;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;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 via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;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.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | 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;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(same as Spring.GetUnitCommands)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | 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;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | 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;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&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;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
=== Ground Informations ===&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;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
=== Test Building ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&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 != 0 then with a blocking feature that can be reclaimed)&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;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;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;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11699</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=11699"/>
		<updated>2010-09-09T21:45:52Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added warning about deprecated functions&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;
= Resources =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.UseTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, &lt;br /&gt;
    string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;,number amount |&lt;br /&gt;
    { metal = number amount, energy = number amount}&lt;br /&gt;
  ) -&amp;gt; nil | boolean hadEnough&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string res, number amount ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for res are:&lt;br /&gt;
    &amp;quot;m&amp;quot;  = metal&lt;br /&gt;
    &amp;quot;e&amp;quot;  = energy&lt;br /&gt;
    &amp;quot;ms&amp;quot;  = metal storage&lt;br /&gt;
    &amp;quot;es&amp;quot;  = energy storage&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamShareLevel&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ShareTeamResource&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID_src, number teamID_recv, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateUnit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: offmap positions are clamped! (you still can use MoveCtrl todo so)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number unitDefID,&lt;br /&gt;
    number x, number y, number z,&lt;br /&gt;
    (number facing | string &amp;quot;facing&amp;quot;),&lt;br /&gt;
    number teamID,&lt;br /&gt;
    [boolean build = false] ) -&amp;gt; number unitID&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
  if build is true the unit is created in &amp;quot;being built&amp;quot; state, with buildProgress = 0&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    [boolean selfd = false,]&lt;br /&gt;
    [boolean reclaimed = false,]&lt;br /&gt;
    [number attackerID] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
 selfd := makes the unit act like it self-destructed&lt;br /&gt;
 reclaimed := don&#039;t show any DeathSequences, don&#039;t leave a wreckage.&lt;br /&gt;
   NOTE this does _not_ give back the resources to the team!&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    numer newTeamID,&lt;br /&gt;
    [boolean given = true] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;if given=false, the unit is captured&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCosts&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, { &lt;br /&gt;
     [ buildTime  = number amount ],&lt;br /&gt;
     [ metalCost  = number amount ],&lt;br /&gt;
     [ energyCost = number amount ]&lt;br /&gt;
   } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;tooltip&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number health |&lt;br /&gt;
    { [ health   = number health ],&lt;br /&gt;
      [ capture  = number capture ],&lt;br /&gt;
      [ paralyze = number paralyze ],&lt;br /&gt;
      [ build    = number build ] }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMaxHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number maxHealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitDamage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number damage&lt;br /&gt;
    [, number paralyze = 0 [, number attackerID = -1 [, number weaponID = -1&lt;br /&gt;
      [, number impulse_x [, number impulse_y [, number impulse_z ]]] ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number stockpile [, number buildPercent ]]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number experience ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number fuel ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID, number teamID [, boolean isRoot] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean neutral ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number enemyUnitID | number x, number y, number z,&lt;br /&gt;
    [ boolean dgun = false ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitBlocking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean blocking [, boolean collide ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number depth [,number range] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitBuildSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number builderID,&lt;br /&gt;
    number buildSpeed, [ number repairSpeed [, number reclaimSpeed&lt;br /&gt;
  [,number resurrectSpeed [, number captureSpeed [, number terraformSpeed ]] ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitArmored&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean armored ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean enabled [, number power] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot;, number mode ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;moveFactor&amp;quot;, number factor) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;minDamage&amp;quot;, number minDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;mazDamage&amp;quot;, number maxDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot;, number x, number y, number z) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum, table states ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&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;aimReady&amp;quot; = number value,] &amp;lt;span class=note&amp;gt;(&amp;lt;&amp;gt;0.0f := true)&amp;lt;/span&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&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_TYPE_FOOTPRINT, // intersection of sphere and footprint-prism&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;
&#039;&#039;&#039;Spring.SetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceIndex, boolean affectLocal, boolean affectGlobal,&lt;br /&gt;
    boolean enableLocal, boolean enableGlobal, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number travel [, number travelPeriod] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMoveGoal&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;used by default commands to get in build-,attackrange etc.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number x, number y, number z,&lt;br /&gt;
    [, number radius = 0 [, number speed = unit-&amp;gt;maxSpeed * 2 ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPhysics&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number posx, number posy, number posz,&lt;br /&gt;
    number velx, number vely, number velz,&lt;br /&gt;
    number rotx, number roty, number rotz,&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number x, number z [, boolean alwaysAboveSea] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number velx, number vely, number velz ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitRotation&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number rotx, number roty, number rotz ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitImpulse&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitSeismicPing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pingSize ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveBuildingDecal&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCloak&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    boolean cloaked | number scriptCloak,&lt;br /&gt;
    [ number decloakDistance | boolean decloakAbs ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  If the 2nd argument is a number, the value works like this:&lt;br /&gt;
   1:=normal cloak&lt;br /&gt;
   2:=for free cloak (cost no E)&lt;br /&gt;
   3:=for free + no decloaking (except the unit is stunned)&lt;br /&gt;
   4&amp;gt;=ultimative cloak (no ecost, no decloaking, no stunned decloak)&lt;br /&gt;
&lt;br /&gt;
  The decloak distance is only changed if the 3th argument is a number or a boolean.&lt;br /&gt;
   If the boolean is false it takes the default decloak distance for that unitdef,&lt;br /&gt;
   if the boolean is true it takes the absolute value of it.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSonarStealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean sonarStealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitStealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean stealth ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean alwaysVisible ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLosMask&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number allyTeam, number los | table losTypes ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;the 3th argument is either the bit-and combination of the following numbers:&lt;br /&gt;
  LOS_INLOS     = 1&lt;br /&gt;
  LOS_INRADAR   = 2&lt;br /&gt;
  LOS_PREVLOS   = 4&lt;br /&gt;
  LOS_CONTRADAR = 8&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;or a table of the following form:&lt;br /&gt;
  losTypes = {&lt;br /&gt;
    [los = boolean,]&lt;br /&gt;
    [radar = boolean,]&lt;br /&gt;
    [prevLos = boolean,]&lt;br /&gt;
    [contRadar = boolean,]&lt;br /&gt;
  }&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLosState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number allyTeam, number los | table losTypes ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;see above for more info on the arguments&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type, number radius ) -&amp;gt; nil | number newRadius&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;type can be:&lt;br /&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;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unit Ressourcing ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitResourcing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    string res, number amount |&lt;br /&gt;
    { res = number amount, ... }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for res are: &amp;quot;[u|c][u|m][m|e]&amp;quot;&lt;br /&gt;
       unconditional | conditional&lt;br /&gt;
                 use | make&lt;br /&gt;
               metal | energy&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UseUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil | boolean okay&lt;br /&gt;
  ( number unitID, { [&amp;quot;m&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;e&amp;quot; | &amp;quot;energy&amp;quot;] = amount, ... } ) -&amp;gt; nil | boolean okay&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateFeature&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number featureID, number x, number y, number z&lt;br /&gt;
   [,number heading [, number AllyTeamID ]] ) -&amp;gt; number featureID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number health) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureReclaim&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number reclaimLeft) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, string &amp;quot;UnitDefName?&amp;quot; [, number facing | string &amp;quot;facing&amp;quot; ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z [, boolean snapToGround]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitCollisionVolumeData for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&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;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&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;
    [ 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;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade&lt;br /&gt;
   &amp;lt;font color=#55ee99&amp;gt;[, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]]&amp;lt;/font&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
   it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
   If this integer differs from the one before the experience change&lt;br /&gt;
   it will call UnitExperience().&lt;br /&gt;
  Also those 3 last params are only available in .cheat&lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot;,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_ConstGame&amp;diff=11216</id>
		<title>Lua ConstGame</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_ConstGame&amp;diff=11216"/>
		<updated>2010-09-09T21:44:02Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added warning about deprecated functions&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;
= Engine =&lt;br /&gt;
string &#039;&#039;&#039;Game.version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
number &#039;&#039;&#039;Game.gameID&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;   Not implemented as of version 0.81.2.1&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
number &#039;&#039;&#039;Game.maxUnits&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.maxTeams&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.maxPlayers&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.squareSize&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.gameSpeed&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Host =&lt;br /&gt;
number &#039;&#039;&#039;Game.gameMode&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt; &lt;br /&gt;
number &#039;&#039;&#039;Game.startPosType&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
boolean &#039;&#039;&#039;Game.commEnds&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt; &lt;br /&gt;
boolean &#039;&#039;&#039;Game.limitDGun&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt; &lt;br /&gt;
boolean &#039;&#039;&#039;Game.ghostedBuildings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Checksums =&lt;br /&gt;
string &#039;&#039;&#039;Game.mapChecksum&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modChecksum&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
bool &#039;&#039;&#039;Game.mapDamage&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.mapName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.mapHumanName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapX&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapY&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapSizeX&#039;&#039;&#039;  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  in worldspace/opengl coords&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapSizeZ&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  in worldspace/opengl coords&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.gravity&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.tidal&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.windMin&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.windMax&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.extractorRadius&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterDamage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Mod =&lt;br /&gt;
string &#039;&#039;&#039;Game.modName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modShortName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modVersion&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modMutator&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modDesc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
boolean &#039;&#039;&#039;Game.allowTeamColors&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportAir&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportShip&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportHover&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportGround&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.fireAtKilled&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.fireAtCrashing&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.requireSonarUnderWater&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Constructor =&lt;br /&gt;
boolean &#039;&#039;&#039;Game.constructionDecay&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.constructionDecayTime&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.constructionDecaySpeed&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
number &#039;&#039;&#039;Game.multiReclaim&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimMethod&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimUnitMethod&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimUnitEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimUnitEfficiency&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimFeatureEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.reclaimAllowEnemies&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.reclaimAllowAllies&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.repairEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.resurrectEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.captureEnergyCostFactor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Categories =&lt;br /&gt;
table &#039;&#039;&#039;Game.springCategories&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  example: {&lt;br /&gt;
    [&amp;quot;vtol&amp;quot;]         = 0,  [&amp;quot;special&amp;quot;]      = 1,  [&amp;quot;noweapon&amp;quot;]     = 2,&lt;br /&gt;
    [&amp;quot;notair&amp;quot;]       = 3,  [&amp;quot;notsub&amp;quot;]       = 4,  [&amp;quot;all&amp;quot;]          = 5,&lt;br /&gt;
    [&amp;quot;weapon&amp;quot;]       = 6,  [&amp;quot;notship&amp;quot;]      = 7,  [&amp;quot;notland&amp;quot;]      = 8,&lt;br /&gt;
    [&amp;quot;mobile&amp;quot;]       = 9,  [&amp;quot;kbot&amp;quot;]         = 10, [&amp;quot;antigator&amp;quot;]    = 11,&lt;br /&gt;
    [&amp;quot;tank&amp;quot;]         = 12, [&amp;quot;plant&amp;quot;]        = 13, [&amp;quot;ship&amp;quot;]         = 14,&lt;br /&gt;
    [&amp;quot;antiemg&amp;quot;]      = 15, [&amp;quot;antilaser&amp;quot;]    = 16, [&amp;quot;antiflame&amp;quot;]    = 17,&lt;br /&gt;
    [&amp;quot;underwater&amp;quot;]   = 18, [&amp;quot;hover&amp;quot;]        = 19, [&amp;quot;phib&amp;quot;]         = 20,&lt;br /&gt;
    [&amp;quot;constr&amp;quot;]       = 21, [&amp;quot;strategic&amp;quot;]    = 22, [&amp;quot;commander&amp;quot;]    = 23,&lt;br /&gt;
    [&amp;quot;paral&amp;quot;]        = 24, [&amp;quot;jam&amp;quot;]          = 25, [&amp;quot;mine&amp;quot;]         = 26,&lt;br /&gt;
    [&amp;quot;kamikaze&amp;quot;]     = 27, [&amp;quot;minelayer&amp;quot;]    = 28, [&amp;quot;notstructure&amp;quot;] = 29,&lt;br /&gt;
    [&amp;quot;air&amp;quot;]          = 30&lt;br /&gt;
  }&amp;lt;/font&amp;gt;&lt;br /&gt;
table &#039;&#039;&#039;Game.armorTypes&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(bidirectional)&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  example: {&lt;br /&gt;
    [1]  = amphibious,   [2] = anniddm,     [3] = antibomber,&lt;br /&gt;
    [4]  = antifighter,  [5] = antiraider,  [6] = atl,&lt;br /&gt;
    [7]  = blackhydra,   [8] = bombers,     [9] = commanders,&lt;br /&gt;
    [10] = crawlingbombs, ...&lt;br /&gt;
&lt;br /&gt;
    [&amp;quot;amphibious&amp;quot;]   = 1, [&amp;quot;anniddm&amp;quot;]    = 2, [&amp;quot;antibomber&amp;quot;] = 3&lt;br /&gt;
    [&amp;quot;antifighter&amp;quot;]  = 4, [&amp;quot;antiraider&amp;quot;] = 5, [&amp;quot;atl&amp;quot;]        = 6&lt;br /&gt;
    [&amp;quot;blackhydra&amp;quot;]   = 7, [&amp;quot;bombers&amp;quot;]    = 8, [&amp;quot;commanders&amp;quot;] = 9&lt;br /&gt;
    [&amp;quot;crawlingbombs&amp;quot;]= 10, ...&lt;br /&gt;
  }&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Water Visuals =&lt;br /&gt;
boolean &#039;&#039;&#039;Game.waterVoid&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.waterPlane&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.waterTexture&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterRepeatX&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterRepeatY&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.waterFoamTexture&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.waterNormalTexture&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
table  &#039;&#039;&#039;Game.waterCausticTextures&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;= {&amp;quot;tex1&amp;quot;,&amp;quot;tex2&amp;quot;,..}&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterAbsorb&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;= { number r, number g, number b}&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterBaseColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterMinColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterSurfaceColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterSurfaceAlpha&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterSpecularColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterSpecularFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterPlaneColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterFresnelMin&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterFresnelMax&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterFresnelPower&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.fogColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.groundAmbientColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.groundSpecularColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.groundSunColor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16871</id>
		<title>Simple Game Tutorial</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16871"/>
		<updated>2010-08-23T11:54:22Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added comment about filename vs unitsync name for dependency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Until I Finish [[Mod Development]] is the place to go.&lt;br /&gt;
&lt;br /&gt;
This Tutorial Aims to get a person from knowing nothing about Spring to the point where they can create and edit mods.&lt;br /&gt;
&lt;br /&gt;
Right now I am working from memory so you may want to correct me when I&#039;m wrong, I will try to cross link from my summaries to the appropriate articles available in other places.&lt;br /&gt;
&lt;br /&gt;
I will not go too deep into making 3do&#039;s because they are old and dumb... but I&#039;ll try to make note of the differences here.&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know anything about scripting right now, so that section is likely to be sparse when I write it, I hope that someone will expand on it.&lt;br /&gt;
&lt;br /&gt;
=Book 1: The First Unit=&lt;br /&gt;
&lt;br /&gt;
==Step 1:Planning==&lt;br /&gt;
Who cares about planning, you know what you&#039;re doing... just come up with an idea for a mod... I made a chess set... if you don&#039;t have a real idea and just want to make a model show up in the game... then yeah... this is the place to start... I&#039;d do that if I were you.&lt;br /&gt;
&lt;br /&gt;
Another good thing to do at this point is to creat a &amp;quot;working directory&amp;quot;, and inside it create a directory with the name that your mod will have... after many headaches I decided it&#039;s best to put this in the root directory of your system so it&#039;s really easy to find when you are switching around back and forth between folders and keep having to find your files over and over again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Step 2:Getting The Tools==&lt;br /&gt;
You will need a bunch of stuff... here&#039;s the list (I assume you are using windows)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Want:&#039;&#039;&lt;br /&gt;
*[http://taspring.clan-sy.com/download.php Spring] - The main program, you will likely need this to test if you&#039;ve screwed up&lt;br /&gt;
*A Tiny Map (2x2) - to test your mod fast (suggest [http://www.fileuniverse.com/?p=showitem&amp;amp;ID=2534 Simple Chess Map])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Need:&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Program listings can be found here:&#039;&#039;&#039; &#039;&#039;&#039;[http://taspring.clan-sy.com/wiki/Map%2C_Mod%2C_And_Unit_Development_Programs Map, Mod, And Unit Development Programs]&#039;&#039;&#039;&lt;br /&gt;
*3D Modeling Program - &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Notepad - to edit all the miriad of text files&lt;br /&gt;
*A Graphical Editing Program - needs to handle RGBA TGAs (aka tga&#039;s with alpha channels), I suggest Photoshop if you have it, or The GIMP... needed for all of the texture making for UVmapping stuff... &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Upspring 1.3 - To convert your models to the approprite s3o format (if you want to fight with 3do builder, then go ahead... a good trick is to get your model into upspring first and adjust all the hierachy, then save it as an 3do... but why bother?). &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Scriptor - to make and compile your units &amp;quot;animation script&amp;quot;... or steal someone else&#039;s and make it work for your unit. &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Compression Utility - (I suggest [http://www.7-zip.org/ 7zip] - even if you are using zip compression and not 7zip, it&#039;s still good to have)&lt;br /&gt;
&lt;br /&gt;
==Step 3:Making a 3D Model==&lt;br /&gt;
&lt;br /&gt;
Go into your 3D modelling program and make a 3D model, [http://taspring.clan-sy.com/w/images/b/b4/WingsCombine.PNG combine] all the objects and UV map the model, then separate it out into any parts that need to move independently of each other.  Then Export the UV map as an Image File and Export the whole thing as a 3ds file.  Put the original wings file, the UVMap image and the 3ds file into your working directory so you can find them later.&lt;br /&gt;
&lt;br /&gt;
Wings 3D UV Mapping tutorial has been started here - [[Units:CreateModel]]&lt;br /&gt;
&lt;br /&gt;
==Step 4:Fixing Your Images==&lt;br /&gt;
&lt;br /&gt;
[[Basic s3o unit making guide|This Article includes a UVMapping Guide]]&lt;br /&gt;
&lt;br /&gt;
Open up your UVMap in Photoshop (or whatever) go to the layer/chooser thingy and go to the Channels Tab, add a new layer (it should default to alpha) and fill it with 99% black so you can see your texture in upspring.  If you want to can paint the UVmap and put white (1% black) on the alpha channel where you want your team colours to show up (you can use something between 1% and 99% to get a blend of your team colour along with the texture... for example 50% will give you your texture with 50% of the team colour mixed in...)&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know how to do glow maps... XXreminder for someone to create a Glowmapping tutorial... you don&#039;t acctually need one for the model to show up.&lt;br /&gt;
&lt;br /&gt;
Save these images both in the working directory.&lt;br /&gt;
&lt;br /&gt;
Save a copy of these images in tga format into &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unittextures&lt;br /&gt;
&lt;br /&gt;
==Step 5:Upspring==&lt;br /&gt;
&lt;br /&gt;
===Importing Your 3ds===&lt;br /&gt;
Open Upspring 1.3, go to file&amp;gt;load model and navigate to and open your 3DS model you exported, you should see the model in upspring as a 3d mesh.  Go to the model tab and set the radius and height values to something other then zero... this defines where the health bar will show up, and more importantly, how big the collision sphere will be.&lt;br /&gt;
&lt;br /&gt;
You will also need to use all of the other tools on those tabs to resize and rotate and move your model to the right place... wings makes models that are 90 degrees off and about 30 times smaller than most spring models... make sure you click the &amp;quot;apply transform&amp;quot; button after any changes that you actually want to show up in the game.&lt;br /&gt;
&lt;br /&gt;
Also, you will want to make the hierachy work using the cut, paste, and add empty buttons.  You will need an object called &amp;quot;base&amp;quot; that all the other objects are connected to... the &amp;quot;origin object&amp;quot;... sometimes you get lucky and wings exports it properly... usually not.&lt;br /&gt;
&lt;br /&gt;
===Importing Your UV and Glowmaps===&lt;br /&gt;
&lt;br /&gt;
Go to the textures tab and make your UV/texture/team-colour map as &amp;quot;texture1&amp;quot; and your UV/glow/reflectivity map as &amp;quot;texture2&amp;quot;... it should show up correctly in the preview pane.&lt;br /&gt;
&lt;br /&gt;
===Exporting Your s3o===&lt;br /&gt;
Choose File&amp;gt;Save Model As then in the drop down select &amp;quot;s3o&amp;quot; and type an appropriate name. This model should be saved to your working directory, and a copy of it made to &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/objects3d/&lt;br /&gt;
&lt;br /&gt;
==Step 6: Lua files==&lt;br /&gt;
&lt;br /&gt;
===UnitName.lua===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For Reference visit [[Units:FBI]], but again, the easiest way to do this is to extract an existing mod and find the fbi for a unit that behaves similarly to the one you are trying to make and rename and modify it.&lt;br /&gt;
&lt;br /&gt;
Some More Specific Information Not Clear in the &amp;quot;Units:FBI&amp;quot; article:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name+&amp;quot; &amp;quot;+Description=Spring Display Name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you have the following settings:&lt;br /&gt;
&lt;br /&gt;
 Name=Tiger;&lt;br /&gt;
 Description=Fast Attack C.A.T.;&lt;br /&gt;
&lt;br /&gt;
The Tooltip will show &amp;quot;Tiger Fast Attack C.A.T.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BuildPic Defaults to UnitName.bmp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you leave out &amp;quot;BuildPic=filename.bmp;&amp;quot; Spring will look in /unitpics/ for a file called &amp;quot;UnitName.bmp&amp;quot; to use as your buildpic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ObjectName&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you want to use an s3o object, you will need to specify with &amp;quot;ObjectName=UnitName&#039;&#039;&#039;.S3O;&#039;&#039;&#039;&amp;quot; otherwise it will look for &amp;quot;UnitName.3do&amp;quot;.  Also, you don&#039;t have to use &amp;quot;UnitName&amp;quot; as the filename and, in fact, multiple Unit&#039;s fbi files can reference the same 3D models. It is easier, however, for people to figure out what you are doing in your mod if you follow the standards.&lt;br /&gt;
&lt;br /&gt;
Save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unitDef = {&lt;br /&gt;
  unitname           = [[arm_spider]],&lt;br /&gt;
  name               = [[Weaver]],&lt;br /&gt;
  description        = [[Cloaking Construction Spider, Builds at 9 m/s]],&lt;br /&gt;
  acceleration       = 0.15,&lt;br /&gt;
  bmcode             = [[1]],&lt;br /&gt;
  brakeRate          = 0.15,&lt;br /&gt;
  buildCostEnergy    = 230,&lt;br /&gt;
  buildCostMetal     = 230,&lt;br /&gt;
  buildDistance      = 80,&lt;br /&gt;
  builder            = true,&lt;br /&gt;
&lt;br /&gt;
  buildoptions       = {&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  buildPic           = [[arm_spider.png]],&lt;br /&gt;
  buildTime          = 230,&lt;br /&gt;
  canAttack          = false,&lt;br /&gt;
  canGuard           = true,&lt;br /&gt;
  canMove            = true,&lt;br /&gt;
  canPatrol          = true,&lt;br /&gt;
  canreclamate       = [[1]],&lt;br /&gt;
  canstop            = [[1]],&lt;br /&gt;
  category           = [[LAND UNARMED]],&lt;br /&gt;
  cloakCost          = 1,&lt;br /&gt;
  cloakCostMoving    = 2,&lt;br /&gt;
  corpse             = [[DEAD]],&lt;br /&gt;
&lt;br /&gt;
  customParams       = {&lt;br /&gt;
    description_bp = [[Aranha e de construÃƒÂ§?o, ConstrÃƒÂ³i a 6 m/s]],&lt;br /&gt;
    description_es = [[Ara?a de construcciÃƒÂ³n, construye a 6 m/s]],&lt;br /&gt;
    description_fi = [[Rakentaja/kaikuluotainkiipeilij?, rakentaa 6m/s nopeudella]],&lt;br /&gt;
    description_fr = [[Araign?e de Construction, Construit ? 6 m/s]],&lt;br /&gt;
    description_it = [[Ragno do costruzione occultante, costruisce a 6 m/s]],&lt;br /&gt;
    description_pl = [[Paj?k konstruktor, buduje z pr?dko?ci? 6m/s]],&lt;br /&gt;
    helptext       = [[The Weaver is a constructor that can climb over any obstacle and build defenses on high ground.]],&lt;br /&gt;
    helptext_bp    = [[Weaver ÃƒÂ© o construtor escalador camuflÃƒÂ¡vel de NOVA. Pode subir qualquer obstÃƒÂ¡culo, mas constrÃƒÂ³i mais devagar que construtores normais.]],&lt;br /&gt;
    helptext_es    = [[El Weaver es el constructor que puede treparse sobre qualquier obstÃƒÂ¡culo y construir defensas en terreno alto]],&lt;br /&gt;
    helptext_fi    = [[Weaver pystyy liikkumaan vaikeakulkuisimmassakin maastossa ja rakentamaan vaivatta my?s useimmille muille rakentajille saavuttamattomiin paikkoihin.]],&lt;br /&gt;
    helptext_fr    = [[Le weaver est un robot de construction tout terrain qui peut batir des d?fenses en terrain ?lev?.]],&lt;br /&gt;
    helptext_it    = [[Il Weaver ÃƒÂ© un costruttore che puo arrampicarsi su qualunque ostacolo e costruire difese nel terreno alto]],&lt;br /&gt;
    helptext_pl    = [[Weaver jest konstruktorem mog?cym wspina? si? po ka?dej powierzchni oraz posiadaj?cym mo?liwo?? maskowania si?]],&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  defaultmissiontype = [[Standby]],&lt;br /&gt;
  designation        = [[ARM-MLSPD]],&lt;br /&gt;
  energyMake         = 0.15,&lt;br /&gt;
  energyUse          = 0,&lt;br /&gt;
  explodeAs          = [[BIG_UNITEX]],&lt;br /&gt;
  footprintX         = 3,&lt;br /&gt;
  footprintZ         = 3,&lt;br /&gt;
  iconType           = [[builder]],&lt;br /&gt;
  mass               = 115,&lt;br /&gt;
  maxDamage          = 750,&lt;br /&gt;
  maxslope           = 16,&lt;br /&gt;
  maxSlope           = 72,&lt;br /&gt;
  maxVelocity        = 1.7,&lt;br /&gt;
  maxWaterDepth      = 22,&lt;br /&gt;
  metalMake          = 0.15,&lt;br /&gt;
  movementClass      = [[TKBOT3]],&lt;br /&gt;
  noAutoFire         = false,&lt;br /&gt;
  noChaseCategory    = [[TERRAFORM SATELLITE FIXEDWING GUNSHIP HOVER SHIP SWIM SUB LAND FLOAT SINK]],&lt;br /&gt;
  objectName         = [[ARMMLSPD]],&lt;br /&gt;
  radarDistanceJam   = 256,&lt;br /&gt;
  seismicSignature   = 16,&lt;br /&gt;
  selfDestructAs     = [[BIG_UNITEX]],&lt;br /&gt;
  showNanoSpray      = false,&lt;br /&gt;
  side               = [[ARM]],&lt;br /&gt;
  sightDistance      = 295,&lt;br /&gt;
  smoothAnim         = true,&lt;br /&gt;
  steeringmode       = [[1]],&lt;br /&gt;
  TEDClass           = [[CNSTR]],&lt;br /&gt;
  terraformSpeed     = 450,&lt;br /&gt;
  threed             = [[1]],&lt;br /&gt;
  turninplace        = 0,&lt;br /&gt;
  turnRate           = 1020,&lt;br /&gt;
  workerTime         = 9,&lt;br /&gt;
  zbuffer            = [[1]],&lt;br /&gt;
&lt;br /&gt;
  featureDefs        = {&lt;br /&gt;
&lt;br /&gt;
    DEAD  = {&lt;br /&gt;
      description      = [[Wreckage - Weaver]],&lt;br /&gt;
      blocking         = true,&lt;br /&gt;
      category         = [[arm_corpses]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[DEAD2]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[40]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[ARMMLSPD_dead]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    DEAD2 = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[HEAP]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    HEAP  = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 46,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 46,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return lowerkeys({ arm_spider = unitDef })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
&lt;br /&gt;
===modinfo.lua===&lt;br /&gt;
&lt;br /&gt;
modinfo.lua is a lua file that defines a number of things that are used when loading a mod, most of the information is self explanitory but basically what you are doing is defining what is going to show up in whatever mod-selection interface you use as well as what other files need to be loaded into memory in order for your mod to work.&lt;br /&gt;
&lt;br /&gt;
====Making a New Mod with your unit/units====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are starting from scratch and making your own mod. This is also good when you are just testing one unit to see if it works.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;MyMod&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		name = &amp;quot;My Mod&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;My Mod That I Made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.theplacepeoplecangetthelatestversionofyourmod.com&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			&amp;quot;Spring content v1&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Cursors&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Bitmaps&amp;quot;,&lt;br /&gt;
			-- Number of other content names this one replaces&lt;br /&gt;
                        added comment about filename vs unitsync name for dependency&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Adding Your Unit to an Existing Mod====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are adding new units to an existing mod (in this case XTA SE v066), this is good for adding units to the build tree of an existing mod or adding a whole new team.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- Description of the mod control file recognized by spring:&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;XTASE_MyUnits&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		name = &amp;quot;XTASEv0.66 with+My Units&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;xta_se_v066 with the cool tank I made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.fileuniverse.com/exactlocationblahblahblah&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			&amp;quot;XTAsev066&amp;quot;,&lt;br /&gt;
                        &amp;quot;Spring Cursors&amp;quot;,&lt;br /&gt;
                        &amp;quot;Spring content v1&amp;quot;,&lt;br /&gt;
			-- Number of other archives this one replaces&lt;br /&gt;
                                        --do not used filenames, use the internal name, or downloader programs will fail to download the dependencies automatically&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are not depending on OTA files, you will have to supply your own cursors.&lt;br /&gt;
&lt;br /&gt;
There are some extra bits in these examples, but I work on the &amp;quot;better safe than sorry&amp;quot; principle... which is to wait for someone who knows what they are doing to fix my articles. &lt;br /&gt;
&lt;br /&gt;
You will want to save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
===armorDefs.lua===&lt;br /&gt;
&lt;br /&gt;
I&#039;m not exactly sure how this works, but the file needs to exist, so either steal one from another mod and modify it... or just make a file that looks like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local armorDefs = {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will want to save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata&lt;br /&gt;
&lt;br /&gt;
===sidedata.lua===&lt;br /&gt;
&lt;br /&gt;
Start by stealing the sidedata.lua file from your dependency mod if you have one, then edit it to include your units/side.&lt;br /&gt;
&lt;br /&gt;
Basically this file is in the form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local sideData = {&lt;br /&gt;
	[1] = {&lt;br /&gt;
		name      = &#039;Good Guys&#039;,&lt;br /&gt;
		startunit = &#039;GG_comm&#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are also additional &amp;quot;[X]&amp;quot; entries for each side/team/commander-choice available in the mod-selector you choose.&lt;br /&gt;
&lt;br /&gt;
You will save this file as lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata/&lt;br /&gt;
&lt;br /&gt;
===moveDefs.lua===&lt;br /&gt;
This file determines the footprint of your units, the angle of slopes they can climb and in how deep water they can drive. It contains several entries, all in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local moveDefs = {&lt;br /&gt;
	KBOT1 = { -- This is the name. Unit files refer to this name.&lt;br /&gt;
		footprintx = 1, -- This is how big the X dimension is of the footprint in Spring units probably?&lt;br /&gt;
		footprintz = 1, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxwaterdepth = 15, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxslope = 36, -- The maximum angle of slopes this unit can climb.&lt;br /&gt;
		crushstrength = 5, -- This determines if the unit/unit class can crush certain features&lt;br /&gt;
	},&lt;br /&gt;
	-- etc..&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sounds.lua===&lt;br /&gt;
This file refers to all the sounds your units make, so Spring knows which sound file is linked to what action. It contains entries in the following format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local Sounds = {&lt;br /&gt;
   SoundItems = {&lt;br /&gt;
      IncomingChat = {&lt;br /&gt;
         file = &amp;quot;sounds/nexuiz/talk.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
      },&lt;br /&gt;
      MultiSelect = {&lt;br /&gt;
         file = &amp;quot;sounds/ota/button9.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      MapPoint = {&lt;br /&gt;
         file = &amp;quot;sounds/bzflag/teamgrab.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      FailedCommand = {&lt;br /&gt;
         file = &amp;quot;sounds/openQuarz/pkup.wav&amp;quot;,&lt;br /&gt;
         gain = 0.75,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         in3d = false,&lt;br /&gt;
      },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Step 7:Adding a Build Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 96x96 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unitpics/ folder named either &amp;quot;UnitName.bmp&amp;quot; or whatever you specified in the &amp;quot;BuildPic=&amp;quot; line of your fbi.&lt;br /&gt;
&lt;br /&gt;
==Step 8:Adding a Side Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 16x16 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/sidepics/ folder named &amp;quot;teamname.bmp&amp;quot; or whatever you specified in the &amp;quot;name=&amp;quot; line of your SIDEDATA.TDF for each side/team you have added.&lt;br /&gt;
&lt;br /&gt;
==Step 9:Scriptor==&lt;br /&gt;
&lt;br /&gt;
===Stealing a Script===&lt;br /&gt;
Open someone else&#039;s script in scriptor that works the way you want your script to work, look at the top where it&#039;s talking about &amp;quot;piece names&amp;quot;... then change those piece names to be the piece names of your unit and do a find/replace to make all the places where those pieces show up to be your pieces too.  Compile it so its name is the same as the &amp;quot;UnitName=&amp;quot; value in your &amp;quot;UnitName.fbi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
XXreminder to someone to link to a proper scripting tutorial&lt;br /&gt;
&lt;br /&gt;
Put the bos and cob files for your unit script in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/scripts&lt;br /&gt;
&lt;br /&gt;
==Step 10:Compiling Your Mod==&lt;br /&gt;
&lt;br /&gt;
You may want to check your mod directory and make sure it follows the structure defined [[Mod_Development:Archives|here]].&lt;br /&gt;
&lt;br /&gt;
navigate to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt; and select everything and choose &amp;quot;add to archive &amp;lt;mod name&amp;gt;.7z&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
make a copy of this file called &amp;lt;mod name&amp;gt;v0.7z in your working directory so you don&#039;t screw anything up later, then make a copy of it called &amp;lt;mod name&amp;gt;.sd7 in the mods directory of spring.&lt;br /&gt;
&lt;br /&gt;
An alternative, added in more recent versions is the &amp;quot;.SDD&amp;quot; folder, to use this, copy the entire &amp;lt;mod name&amp;gt; folder in the mods directory of spring and rename it as &amp;quot;&amp;lt;mod name&amp;gt;.SDD&amp;quot;.  The advantage to the &amp;quot;.SDD&amp;quot; method is that you can tweak settings and add files without recompressing your mod all the time.  When it comes time to distribute your mod use &amp;quot;.sd7&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
EXAMPLES:&lt;br /&gt;
If your mod is called JoesMod you will have a file called &amp;quot;JoesMod.sd7&amp;quot; or a folder called &amp;quot;JoesMod.SDD&amp;quot; in your spring mods directory.&lt;br /&gt;
&lt;br /&gt;
==Step 11:Testing Your Mod==&lt;br /&gt;
Open Up your lobby client, pick your mod from the drop-down list of the games in host battle or singleplayer mode if your lobby supports it(if it doesn&#039;t show up you screwed up your modinfo.txt), choose your tiny map from the map list and press start.  If it doesn&#039;t break and your unit shows up, you have created all the neccessary files... yay!&lt;br /&gt;
&lt;br /&gt;
Gotchas:&lt;br /&gt;
*If it doesn&#039;t work, check you didn&#039;t zip the folder itself, but the contents, ie if you open mymod.sd7 with 7zip, you should see folders such as &amp;quot;unittextures&amp;quot; rather than a folder &amp;quot;mymod&amp;quot; containing unittextures.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod development]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16870</id>
		<title>Simple Game Tutorial</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16870"/>
		<updated>2010-08-23T11:54:04Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: added comment about filename vs unitsync name for dependency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Until I Finish [[Mod Development]] is the place to go.&lt;br /&gt;
&lt;br /&gt;
This Tutorial Aims to get a person from knowing nothing about Spring to the point where they can create and edit mods.&lt;br /&gt;
&lt;br /&gt;
Right now I am working from memory so you may want to correct me when I&#039;m wrong, I will try to cross link from my summaries to the appropriate articles available in other places.&lt;br /&gt;
&lt;br /&gt;
I will not go too deep into making 3do&#039;s because they are old and dumb... but I&#039;ll try to make note of the differences here.&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know anything about scripting right now, so that section is likely to be sparse when I write it, I hope that someone will expand on it.&lt;br /&gt;
&lt;br /&gt;
=Book 1: The First Unit=&lt;br /&gt;
&lt;br /&gt;
==Step 1:Planning==&lt;br /&gt;
Who cares about planning, you know what you&#039;re doing... just come up with an idea for a mod... I made a chess set... if you don&#039;t have a real idea and just want to make a model show up in the game... then yeah... this is the place to start... I&#039;d do that if I were you.&lt;br /&gt;
&lt;br /&gt;
Another good thing to do at this point is to creat a &amp;quot;working directory&amp;quot;, and inside it create a directory with the name that your mod will have... after many headaches I decided it&#039;s best to put this in the root directory of your system so it&#039;s really easy to find when you are switching around back and forth between folders and keep having to find your files over and over again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Step 2:Getting The Tools==&lt;br /&gt;
You will need a bunch of stuff... here&#039;s the list (I assume you are using windows)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Want:&#039;&#039;&lt;br /&gt;
*[http://taspring.clan-sy.com/download.php Spring] - The main program, you will likely need this to test if you&#039;ve screwed up&lt;br /&gt;
*A Tiny Map (2x2) - to test your mod fast (suggest [http://www.fileuniverse.com/?p=showitem&amp;amp;ID=2534 Simple Chess Map])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Need:&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Program listings can be found here:&#039;&#039;&#039; &#039;&#039;&#039;[http://taspring.clan-sy.com/wiki/Map%2C_Mod%2C_And_Unit_Development_Programs Map, Mod, And Unit Development Programs]&#039;&#039;&#039;&lt;br /&gt;
*3D Modeling Program - &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Notepad - to edit all the miriad of text files&lt;br /&gt;
*A Graphical Editing Program - needs to handle RGBA TGAs (aka tga&#039;s with alpha channels), I suggest Photoshop if you have it, or The GIMP... needed for all of the texture making for UVmapping stuff... &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Upspring 1.3 - To convert your models to the approprite s3o format (if you want to fight with 3do builder, then go ahead... a good trick is to get your model into upspring first and adjust all the hierachy, then save it as an 3do... but why bother?). &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Scriptor - to make and compile your units &amp;quot;animation script&amp;quot;... or steal someone else&#039;s and make it work for your unit. &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Compression Utility - (I suggest [http://www.7-zip.org/ 7zip] - even if you are using zip compression and not 7zip, it&#039;s still good to have)&lt;br /&gt;
&lt;br /&gt;
==Step 3:Making a 3D Model==&lt;br /&gt;
&lt;br /&gt;
Go into your 3D modelling program and make a 3D model, [http://taspring.clan-sy.com/w/images/b/b4/WingsCombine.PNG combine] all the objects and UV map the model, then separate it out into any parts that need to move independently of each other.  Then Export the UV map as an Image File and Export the whole thing as a 3ds file.  Put the original wings file, the UVMap image and the 3ds file into your working directory so you can find them later.&lt;br /&gt;
&lt;br /&gt;
Wings 3D UV Mapping tutorial has been started here - [[Units:CreateModel]]&lt;br /&gt;
&lt;br /&gt;
==Step 4:Fixing Your Images==&lt;br /&gt;
&lt;br /&gt;
[[Basic s3o unit making guide|This Article includes a UVMapping Guide]]&lt;br /&gt;
&lt;br /&gt;
Open up your UVMap in Photoshop (or whatever) go to the layer/chooser thingy and go to the Channels Tab, add a new layer (it should default to alpha) and fill it with 99% black so you can see your texture in upspring.  If you want to can paint the UVmap and put white (1% black) on the alpha channel where you want your team colours to show up (you can use something between 1% and 99% to get a blend of your team colour along with the texture... for example 50% will give you your texture with 50% of the team colour mixed in...)&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know how to do glow maps... XXreminder for someone to create a Glowmapping tutorial... you don&#039;t acctually need one for the model to show up.&lt;br /&gt;
&lt;br /&gt;
Save these images both in the working directory.&lt;br /&gt;
&lt;br /&gt;
Save a copy of these images in tga format into &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unittextures&lt;br /&gt;
&lt;br /&gt;
==Step 5:Upspring==&lt;br /&gt;
&lt;br /&gt;
===Importing Your 3ds===&lt;br /&gt;
Open Upspring 1.3, go to file&amp;gt;load model and navigate to and open your 3DS model you exported, you should see the model in upspring as a 3d mesh.  Go to the model tab and set the radius and height values to something other then zero... this defines where the health bar will show up, and more importantly, how big the collision sphere will be.&lt;br /&gt;
&lt;br /&gt;
You will also need to use all of the other tools on those tabs to resize and rotate and move your model to the right place... wings makes models that are 90 degrees off and about 30 times smaller than most spring models... make sure you click the &amp;quot;apply transform&amp;quot; button after any changes that you actually want to show up in the game.&lt;br /&gt;
&lt;br /&gt;
Also, you will want to make the hierachy work using the cut, paste, and add empty buttons.  You will need an object called &amp;quot;base&amp;quot; that all the other objects are connected to... the &amp;quot;origin object&amp;quot;... sometimes you get lucky and wings exports it properly... usually not.&lt;br /&gt;
&lt;br /&gt;
===Importing Your UV and Glowmaps===&lt;br /&gt;
&lt;br /&gt;
Go to the textures tab and make your UV/texture/team-colour map as &amp;quot;texture1&amp;quot; and your UV/glow/reflectivity map as &amp;quot;texture2&amp;quot;... it should show up correctly in the preview pane.&lt;br /&gt;
&lt;br /&gt;
===Exporting Your s3o===&lt;br /&gt;
Choose File&amp;gt;Save Model As then in the drop down select &amp;quot;s3o&amp;quot; and type an appropriate name. This model should be saved to your working directory, and a copy of it made to &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/objects3d/&lt;br /&gt;
&lt;br /&gt;
==Step 6: Lua files==&lt;br /&gt;
&lt;br /&gt;
===UnitName.lua===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For Reference visit [[Units:FBI]], but again, the easiest way to do this is to extract an existing mod and find the fbi for a unit that behaves similarly to the one you are trying to make and rename and modify it.&lt;br /&gt;
&lt;br /&gt;
Some More Specific Information Not Clear in the &amp;quot;Units:FBI&amp;quot; article:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name+&amp;quot; &amp;quot;+Description=Spring Display Name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you have the following settings:&lt;br /&gt;
&lt;br /&gt;
 Name=Tiger;&lt;br /&gt;
 Description=Fast Attack C.A.T.;&lt;br /&gt;
&lt;br /&gt;
The Tooltip will show &amp;quot;Tiger Fast Attack C.A.T.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BuildPic Defaults to UnitName.bmp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you leave out &amp;quot;BuildPic=filename.bmp;&amp;quot; Spring will look in /unitpics/ for a file called &amp;quot;UnitName.bmp&amp;quot; to use as your buildpic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ObjectName&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you want to use an s3o object, you will need to specify with &amp;quot;ObjectName=UnitName&#039;&#039;&#039;.S3O;&#039;&#039;&#039;&amp;quot; otherwise it will look for &amp;quot;UnitName.3do&amp;quot;.  Also, you don&#039;t have to use &amp;quot;UnitName&amp;quot; as the filename and, in fact, multiple Unit&#039;s fbi files can reference the same 3D models. It is easier, however, for people to figure out what you are doing in your mod if you follow the standards.&lt;br /&gt;
&lt;br /&gt;
Save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unitDef = {&lt;br /&gt;
  unitname           = [[arm_spider]],&lt;br /&gt;
  name               = [[Weaver]],&lt;br /&gt;
  description        = [[Cloaking Construction Spider, Builds at 9 m/s]],&lt;br /&gt;
  acceleration       = 0.15,&lt;br /&gt;
  bmcode             = [[1]],&lt;br /&gt;
  brakeRate          = 0.15,&lt;br /&gt;
  buildCostEnergy    = 230,&lt;br /&gt;
  buildCostMetal     = 230,&lt;br /&gt;
  buildDistance      = 80,&lt;br /&gt;
  builder            = true,&lt;br /&gt;
&lt;br /&gt;
  buildoptions       = {&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  buildPic           = [[arm_spider.png]],&lt;br /&gt;
  buildTime          = 230,&lt;br /&gt;
  canAttack          = false,&lt;br /&gt;
  canGuard           = true,&lt;br /&gt;
  canMove            = true,&lt;br /&gt;
  canPatrol          = true,&lt;br /&gt;
  canreclamate       = [[1]],&lt;br /&gt;
  canstop            = [[1]],&lt;br /&gt;
  category           = [[LAND UNARMED]],&lt;br /&gt;
  cloakCost          = 1,&lt;br /&gt;
  cloakCostMoving    = 2,&lt;br /&gt;
  corpse             = [[DEAD]],&lt;br /&gt;
&lt;br /&gt;
  customParams       = {&lt;br /&gt;
    description_bp = [[Aranha e de construÃƒÂ§?o, ConstrÃƒÂ³i a 6 m/s]],&lt;br /&gt;
    description_es = [[Ara?a de construcciÃƒÂ³n, construye a 6 m/s]],&lt;br /&gt;
    description_fi = [[Rakentaja/kaikuluotainkiipeilij?, rakentaa 6m/s nopeudella]],&lt;br /&gt;
    description_fr = [[Araign?e de Construction, Construit ? 6 m/s]],&lt;br /&gt;
    description_it = [[Ragno do costruzione occultante, costruisce a 6 m/s]],&lt;br /&gt;
    description_pl = [[Paj?k konstruktor, buduje z pr?dko?ci? 6m/s]],&lt;br /&gt;
    helptext       = [[The Weaver is a constructor that can climb over any obstacle and build defenses on high ground.]],&lt;br /&gt;
    helptext_bp    = [[Weaver ÃƒÂ© o construtor escalador camuflÃƒÂ¡vel de NOVA. Pode subir qualquer obstÃƒÂ¡culo, mas constrÃƒÂ³i mais devagar que construtores normais.]],&lt;br /&gt;
    helptext_es    = [[El Weaver es el constructor que puede treparse sobre qualquier obstÃƒÂ¡culo y construir defensas en terreno alto]],&lt;br /&gt;
    helptext_fi    = [[Weaver pystyy liikkumaan vaikeakulkuisimmassakin maastossa ja rakentamaan vaivatta my?s useimmille muille rakentajille saavuttamattomiin paikkoihin.]],&lt;br /&gt;
    helptext_fr    = [[Le weaver est un robot de construction tout terrain qui peut batir des d?fenses en terrain ?lev?.]],&lt;br /&gt;
    helptext_it    = [[Il Weaver ÃƒÂ© un costruttore che puo arrampicarsi su qualunque ostacolo e costruire difese nel terreno alto]],&lt;br /&gt;
    helptext_pl    = [[Weaver jest konstruktorem mog?cym wspina? si? po ka?dej powierzchni oraz posiadaj?cym mo?liwo?? maskowania si?]],&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  defaultmissiontype = [[Standby]],&lt;br /&gt;
  designation        = [[ARM-MLSPD]],&lt;br /&gt;
  energyMake         = 0.15,&lt;br /&gt;
  energyUse          = 0,&lt;br /&gt;
  explodeAs          = [[BIG_UNITEX]],&lt;br /&gt;
  footprintX         = 3,&lt;br /&gt;
  footprintZ         = 3,&lt;br /&gt;
  iconType           = [[builder]],&lt;br /&gt;
  mass               = 115,&lt;br /&gt;
  maxDamage          = 750,&lt;br /&gt;
  maxslope           = 16,&lt;br /&gt;
  maxSlope           = 72,&lt;br /&gt;
  maxVelocity        = 1.7,&lt;br /&gt;
  maxWaterDepth      = 22,&lt;br /&gt;
  metalMake          = 0.15,&lt;br /&gt;
  movementClass      = [[TKBOT3]],&lt;br /&gt;
  noAutoFire         = false,&lt;br /&gt;
  noChaseCategory    = [[TERRAFORM SATELLITE FIXEDWING GUNSHIP HOVER SHIP SWIM SUB LAND FLOAT SINK]],&lt;br /&gt;
  objectName         = [[ARMMLSPD]],&lt;br /&gt;
  radarDistanceJam   = 256,&lt;br /&gt;
  seismicSignature   = 16,&lt;br /&gt;
  selfDestructAs     = [[BIG_UNITEX]],&lt;br /&gt;
  showNanoSpray      = false,&lt;br /&gt;
  side               = [[ARM]],&lt;br /&gt;
  sightDistance      = 295,&lt;br /&gt;
  smoothAnim         = true,&lt;br /&gt;
  steeringmode       = [[1]],&lt;br /&gt;
  TEDClass           = [[CNSTR]],&lt;br /&gt;
  terraformSpeed     = 450,&lt;br /&gt;
  threed             = [[1]],&lt;br /&gt;
  turninplace        = 0,&lt;br /&gt;
  turnRate           = 1020,&lt;br /&gt;
  workerTime         = 9,&lt;br /&gt;
  zbuffer            = [[1]],&lt;br /&gt;
&lt;br /&gt;
  featureDefs        = {&lt;br /&gt;
&lt;br /&gt;
    DEAD  = {&lt;br /&gt;
      description      = [[Wreckage - Weaver]],&lt;br /&gt;
      blocking         = true,&lt;br /&gt;
      category         = [[arm_corpses]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[DEAD2]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[40]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[ARMMLSPD_dead]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    DEAD2 = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[HEAP]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    HEAP  = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 46,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 46,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return lowerkeys({ arm_spider = unitDef })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
&lt;br /&gt;
===modinfo.lua===&lt;br /&gt;
&lt;br /&gt;
modinfo.lua is a lua file that defines a number of things that are used when loading a mod, most of the information is self explanitory but basically what you are doing is defining what is going to show up in whatever mod-selection interface you use as well as what other files need to be loaded into memory in order for your mod to work.&lt;br /&gt;
&lt;br /&gt;
====Making a New Mod with your unit/units====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are starting from scratch and making your own mod. This is also good when you are just testing one unit to see if it works.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;MyMod&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		name = &amp;quot;My Mod&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;My Mod That I Made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.theplacepeoplecangetthelatestversionofyourmod.com&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			&amp;quot;Spring content v1&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Cursors&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Bitmaps&amp;quot;,&lt;br /&gt;
			-- Number of other content names this one replaces&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Adding Your Unit to an Existing Mod====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are adding new units to an existing mod (in this case XTA SE v066), this is good for adding units to the build tree of an existing mod or adding a whole new team.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- Description of the mod control file recognized by spring:&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;XTASE_MyUnits&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		name = &amp;quot;XTASEv0.66 with+My Units&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;xta_se_v066 with the cool tank I made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.fileuniverse.com/exactlocationblahblahblah&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			&amp;quot;XTAsev066&amp;quot;,&lt;br /&gt;
                        &amp;quot;Spring Cursors&amp;quot;,&lt;br /&gt;
                        &amp;quot;Spring content v1&amp;quot;,&lt;br /&gt;
			-- Number of other archives this one replaces&lt;br /&gt;
                                        --do not used filenames, use the internal name, or downloader programs will fail to download the dependencies automatically&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are not depending on OTA files, you will have to supply your own cursors.&lt;br /&gt;
&lt;br /&gt;
There are some extra bits in these examples, but I work on the &amp;quot;better safe than sorry&amp;quot; principle... which is to wait for someone who knows what they are doing to fix my articles. &lt;br /&gt;
&lt;br /&gt;
You will want to save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
===armorDefs.lua===&lt;br /&gt;
&lt;br /&gt;
I&#039;m not exactly sure how this works, but the file needs to exist, so either steal one from another mod and modify it... or just make a file that looks like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local armorDefs = {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will want to save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata&lt;br /&gt;
&lt;br /&gt;
===sidedata.lua===&lt;br /&gt;
&lt;br /&gt;
Start by stealing the sidedata.lua file from your dependency mod if you have one, then edit it to include your units/side.&lt;br /&gt;
&lt;br /&gt;
Basically this file is in the form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local sideData = {&lt;br /&gt;
	[1] = {&lt;br /&gt;
		name      = &#039;Good Guys&#039;,&lt;br /&gt;
		startunit = &#039;GG_comm&#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are also additional &amp;quot;[X]&amp;quot; entries for each side/team/commander-choice available in the mod-selector you choose.&lt;br /&gt;
&lt;br /&gt;
You will save this file as lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata/&lt;br /&gt;
&lt;br /&gt;
===moveDefs.lua===&lt;br /&gt;
This file determines the footprint of your units, the angle of slopes they can climb and in how deep water they can drive. It contains several entries, all in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local moveDefs = {&lt;br /&gt;
	KBOT1 = { -- This is the name. Unit files refer to this name.&lt;br /&gt;
		footprintx = 1, -- This is how big the X dimension is of the footprint in Spring units probably?&lt;br /&gt;
		footprintz = 1, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxwaterdepth = 15, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxslope = 36, -- The maximum angle of slopes this unit can climb.&lt;br /&gt;
		crushstrength = 5, -- This determines if the unit/unit class can crush certain features&lt;br /&gt;
	},&lt;br /&gt;
	-- etc..&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sounds.lua===&lt;br /&gt;
This file refers to all the sounds your units make, so Spring knows which sound file is linked to what action. It contains entries in the following format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local Sounds = {&lt;br /&gt;
   SoundItems = {&lt;br /&gt;
      IncomingChat = {&lt;br /&gt;
         file = &amp;quot;sounds/nexuiz/talk.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
      },&lt;br /&gt;
      MultiSelect = {&lt;br /&gt;
         file = &amp;quot;sounds/ota/button9.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      MapPoint = {&lt;br /&gt;
         file = &amp;quot;sounds/bzflag/teamgrab.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      FailedCommand = {&lt;br /&gt;
         file = &amp;quot;sounds/openQuarz/pkup.wav&amp;quot;,&lt;br /&gt;
         gain = 0.75,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         in3d = false,&lt;br /&gt;
      },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Step 7:Adding a Build Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 96x96 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unitpics/ folder named either &amp;quot;UnitName.bmp&amp;quot; or whatever you specified in the &amp;quot;BuildPic=&amp;quot; line of your fbi.&lt;br /&gt;
&lt;br /&gt;
==Step 8:Adding a Side Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 16x16 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/sidepics/ folder named &amp;quot;teamname.bmp&amp;quot; or whatever you specified in the &amp;quot;name=&amp;quot; line of your SIDEDATA.TDF for each side/team you have added.&lt;br /&gt;
&lt;br /&gt;
==Step 9:Scriptor==&lt;br /&gt;
&lt;br /&gt;
===Stealing a Script===&lt;br /&gt;
Open someone else&#039;s script in scriptor that works the way you want your script to work, look at the top where it&#039;s talking about &amp;quot;piece names&amp;quot;... then change those piece names to be the piece names of your unit and do a find/replace to make all the places where those pieces show up to be your pieces too.  Compile it so its name is the same as the &amp;quot;UnitName=&amp;quot; value in your &amp;quot;UnitName.fbi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
XXreminder to someone to link to a proper scripting tutorial&lt;br /&gt;
&lt;br /&gt;
Put the bos and cob files for your unit script in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/scripts&lt;br /&gt;
&lt;br /&gt;
==Step 10:Compiling Your Mod==&lt;br /&gt;
&lt;br /&gt;
You may want to check your mod directory and make sure it follows the structure defined [[Mod_Development:Archives|here]].&lt;br /&gt;
&lt;br /&gt;
navigate to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt; and select everything and choose &amp;quot;add to archive &amp;lt;mod name&amp;gt;.7z&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
make a copy of this file called &amp;lt;mod name&amp;gt;v0.7z in your working directory so you don&#039;t screw anything up later, then make a copy of it called &amp;lt;mod name&amp;gt;.sd7 in the mods directory of spring.&lt;br /&gt;
&lt;br /&gt;
An alternative, added in more recent versions is the &amp;quot;.SDD&amp;quot; folder, to use this, copy the entire &amp;lt;mod name&amp;gt; folder in the mods directory of spring and rename it as &amp;quot;&amp;lt;mod name&amp;gt;.SDD&amp;quot;.  The advantage to the &amp;quot;.SDD&amp;quot; method is that you can tweak settings and add files without recompressing your mod all the time.  When it comes time to distribute your mod use &amp;quot;.sd7&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
EXAMPLES:&lt;br /&gt;
If your mod is called JoesMod you will have a file called &amp;quot;JoesMod.sd7&amp;quot; or a folder called &amp;quot;JoesMod.SDD&amp;quot; in your spring mods directory.&lt;br /&gt;
&lt;br /&gt;
==Step 11:Testing Your Mod==&lt;br /&gt;
Open Up your lobby client, pick your mod from the drop-down list of the games in host battle or singleplayer mode if your lobby supports it(if it doesn&#039;t show up you screwed up your modinfo.txt), choose your tiny map from the map list and press start.  If it doesn&#039;t break and your unit shows up, you have created all the neccessary files... yay!&lt;br /&gt;
&lt;br /&gt;
Gotchas:&lt;br /&gt;
*If it doesn&#039;t work, check you didn&#039;t zip the folder itself, but the contents, ie if you open mymod.sd7 with 7zip, you should see folders such as &amp;quot;unittextures&amp;quot; rather than a folder &amp;quot;mymod&amp;quot; containing unittextures.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod development]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Game_specification&amp;diff=8110</id>
		<title>Game specification</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Game_specification&amp;diff=8110"/>
		<updated>2010-08-23T11:52:40Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: use unitsync names, not filenames!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Overview===&lt;br /&gt;
&lt;br /&gt;
This is a specification of how Spring will support mods and switching between them. &lt;br /&gt;
&lt;br /&gt;
Spring looks for games in the folders &amp;quot;maps&amp;quot;, &amp;quot;base&amp;quot; and &amp;quot;mods&amp;quot;, and all their subfolders. It is recommended to put your game in a subfolder of /mods.  Spring supports multiple subfolders within /mods:  &#039;&#039;&#039;/mods/my_nifty_game/game.sdd&#039;&#039;&#039; and &#039;&#039;&#039;/mods/my_nifty_game/game_support.sdz&#039;&#039;&#039; are both correct.&lt;br /&gt;
&lt;br /&gt;
On startup, Spring will search these folders and their subfolders for files called &amp;quot;modinfo.lua&amp;quot;. This file declares all &#039;&#039;dependencies&#039;&#039; of this game, such as additional graphics, sounds and the like.&lt;br /&gt;
&lt;br /&gt;
The general idea is that this file should be used as a manifest file to let Spring know what to do with the archive it is found inside, so each archive file in the mods directory is supposed to have one. Archive files that do not contain this file are ignored, and aren&#039;t available to Spring&#039;s Virtual File System.&lt;br /&gt;
&lt;br /&gt;
===Modinfo.lua Example===&lt;br /&gt;
Modinfo.lua, like any Lua language file, can contain active code, should you want it to.  But it is mainly just designed to refer Spring&#039;s Virtual File System (VFS) to the correct game files and any dependencies of your project.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
	game=&#039;myNiftyGame&#039;,&lt;br /&gt;
	shortGame=&#039;mNg&#039;,&lt;br /&gt;
	name=&#039;My Nifty Game&#039;,&lt;br /&gt;
	mutator=&#039;official&#039;,&lt;br /&gt;
	version=&#039;1.0&#039;,&lt;br /&gt;
	description=&#039;The Awesome Game I Made.&#039;,&lt;br /&gt;
	url=&#039;http://www.my_nifty_url.com/&#039;,&lt;br /&gt;
	modtype=1,&lt;br /&gt;
	depend= {&lt;br /&gt;
		&amp;quot;Content 1&amp;quot;,&lt;br /&gt;
		&amp;quot;Content 2&amp;quot;,&lt;br /&gt;
                --do not used filenames, use the internal name, or downloader programs will fail to download the dependencies automatically&lt;br /&gt;
		},&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dependencies&#039;&#039;&#039; are files that your game depends on to operate.  This may be anything- a map, another game, a folder named &amp;quot;my_nifty_sounds.sdd&amp;quot; that has a bunch of sounds in it and a modinfo.lua file to identify it as a valid file archive to Spring- basically anything goes, so long as it, like your game, is identified as a usable archive by having a modinfo.lua file in it.&lt;br /&gt;
&lt;br /&gt;
These files are loaded in the order listed.  So if depend02.sdd contains a file with the same name as depend01.sdd, it will &amp;lt;u&amp;gt;overwrite that file&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Modtype&#039;&#039;&#039; determines whether Spring&#039;s archive system sees the game as a game, or as an &amp;quot;invisible&amp;quot; file that can only be called as a Dependency.  If set to any number except for 1, it will not be visible to end-users as a &amp;quot;game&amp;quot;, but you can still refer to it in the depend table.&lt;br /&gt;
&lt;br /&gt;
===Replacements===&lt;br /&gt;
&lt;br /&gt;
When releasing new versions of a mod it is recommended that a new unique filename is used. In this manner it would be possible for the lobby to download archives from a fast webserver based on the filename. &lt;br /&gt;
&lt;br /&gt;
But if a new name is used for a support archive with content for example, it would break other mods that depend on the archive. To avoid this, replacements can be used.&lt;br /&gt;
&lt;br /&gt;
Replacements simply specifies which other archives this one replaces. So if a new archive specifies that it replaces old_archive.sdz, any other mod that depends on old_archive.sdz would now use the new one instead.&lt;br /&gt;
&lt;br /&gt;
It is probably not always a good idea to use this for new versions of a mod however, since if you hide the old version people would not be able to switch between the old and the new version. So only use replacements when you are sure that it is what you want.&lt;br /&gt;
&lt;br /&gt;
===Distribution===&lt;br /&gt;
&lt;br /&gt;
If a player does not have a certain game&#039;s files when trying to join a game online, the Lobbies are designed to let them know that they don&#039;t have the game.  If you have uploaded your game to the various services that are supported by the Lobby applications, players can automatically download the game.  Also, SpringDownloader allows players to share the game&#039;s file with others easily.  Modinfo.lua lets both the Lobby application and Spring know what your game is, and whether it &amp;quot;knows&amp;quot; where it can be downloaded from.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod development]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16869</id>
		<title>Simple Game Tutorial</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16869"/>
		<updated>2010-08-23T11:50:45Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: user unitsync names, not filenames!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Until I Finish [[Mod Development]] is the place to go.&lt;br /&gt;
&lt;br /&gt;
This Tutorial Aims to get a person from knowing nothing about Spring to the point where they can create and edit mods.&lt;br /&gt;
&lt;br /&gt;
Right now I am working from memory so you may want to correct me when I&#039;m wrong, I will try to cross link from my summaries to the appropriate articles available in other places.&lt;br /&gt;
&lt;br /&gt;
I will not go too deep into making 3do&#039;s because they are old and dumb... but I&#039;ll try to make note of the differences here.&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know anything about scripting right now, so that section is likely to be sparse when I write it, I hope that someone will expand on it.&lt;br /&gt;
&lt;br /&gt;
=Book 1: The First Unit=&lt;br /&gt;
&lt;br /&gt;
==Step 1:Planning==&lt;br /&gt;
Who cares about planning, you know what you&#039;re doing... just come up with an idea for a mod... I made a chess set... if you don&#039;t have a real idea and just want to make a model show up in the game... then yeah... this is the place to start... I&#039;d do that if I were you.&lt;br /&gt;
&lt;br /&gt;
Another good thing to do at this point is to creat a &amp;quot;working directory&amp;quot;, and inside it create a directory with the name that your mod will have... after many headaches I decided it&#039;s best to put this in the root directory of your system so it&#039;s really easy to find when you are switching around back and forth between folders and keep having to find your files over and over again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Step 2:Getting The Tools==&lt;br /&gt;
You will need a bunch of stuff... here&#039;s the list (I assume you are using windows)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Want:&#039;&#039;&lt;br /&gt;
*[http://taspring.clan-sy.com/download.php Spring] - The main program, you will likely need this to test if you&#039;ve screwed up&lt;br /&gt;
*A Tiny Map (2x2) - to test your mod fast (suggest [http://www.fileuniverse.com/?p=showitem&amp;amp;ID=2534 Simple Chess Map])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Need:&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Program listings can be found here:&#039;&#039;&#039; &#039;&#039;&#039;[http://taspring.clan-sy.com/wiki/Map%2C_Mod%2C_And_Unit_Development_Programs Map, Mod, And Unit Development Programs]&#039;&#039;&#039;&lt;br /&gt;
*3D Modeling Program - &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Notepad - to edit all the miriad of text files&lt;br /&gt;
*A Graphical Editing Program - needs to handle RGBA TGAs (aka tga&#039;s with alpha channels), I suggest Photoshop if you have it, or The GIMP... needed for all of the texture making for UVmapping stuff... &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Upspring 1.3 - To convert your models to the approprite s3o format (if you want to fight with 3do builder, then go ahead... a good trick is to get your model into upspring first and adjust all the hierachy, then save it as an 3do... but why bother?). &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Scriptor - to make and compile your units &amp;quot;animation script&amp;quot;... or steal someone else&#039;s and make it work for your unit. &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Compression Utility - (I suggest [http://www.7-zip.org/ 7zip] - even if you are using zip compression and not 7zip, it&#039;s still good to have)&lt;br /&gt;
&lt;br /&gt;
==Step 3:Making a 3D Model==&lt;br /&gt;
&lt;br /&gt;
Go into your 3D modelling program and make a 3D model, [http://taspring.clan-sy.com/w/images/b/b4/WingsCombine.PNG combine] all the objects and UV map the model, then separate it out into any parts that need to move independently of each other.  Then Export the UV map as an Image File and Export the whole thing as a 3ds file.  Put the original wings file, the UVMap image and the 3ds file into your working directory so you can find them later.&lt;br /&gt;
&lt;br /&gt;
Wings 3D UV Mapping tutorial has been started here - [[Units:CreateModel]]&lt;br /&gt;
&lt;br /&gt;
==Step 4:Fixing Your Images==&lt;br /&gt;
&lt;br /&gt;
[[Basic s3o unit making guide|This Article includes a UVMapping Guide]]&lt;br /&gt;
&lt;br /&gt;
Open up your UVMap in Photoshop (or whatever) go to the layer/chooser thingy and go to the Channels Tab, add a new layer (it should default to alpha) and fill it with 99% black so you can see your texture in upspring.  If you want to can paint the UVmap and put white (1% black) on the alpha channel where you want your team colours to show up (you can use something between 1% and 99% to get a blend of your team colour along with the texture... for example 50% will give you your texture with 50% of the team colour mixed in...)&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know how to do glow maps... XXreminder for someone to create a Glowmapping tutorial... you don&#039;t acctually need one for the model to show up.&lt;br /&gt;
&lt;br /&gt;
Save these images both in the working directory.&lt;br /&gt;
&lt;br /&gt;
Save a copy of these images in tga format into &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unittextures&lt;br /&gt;
&lt;br /&gt;
==Step 5:Upspring==&lt;br /&gt;
&lt;br /&gt;
===Importing Your 3ds===&lt;br /&gt;
Open Upspring 1.3, go to file&amp;gt;load model and navigate to and open your 3DS model you exported, you should see the model in upspring as a 3d mesh.  Go to the model tab and set the radius and height values to something other then zero... this defines where the health bar will show up, and more importantly, how big the collision sphere will be.&lt;br /&gt;
&lt;br /&gt;
You will also need to use all of the other tools on those tabs to resize and rotate and move your model to the right place... wings makes models that are 90 degrees off and about 30 times smaller than most spring models... make sure you click the &amp;quot;apply transform&amp;quot; button after any changes that you actually want to show up in the game.&lt;br /&gt;
&lt;br /&gt;
Also, you will want to make the hierachy work using the cut, paste, and add empty buttons.  You will need an object called &amp;quot;base&amp;quot; that all the other objects are connected to... the &amp;quot;origin object&amp;quot;... sometimes you get lucky and wings exports it properly... usually not.&lt;br /&gt;
&lt;br /&gt;
===Importing Your UV and Glowmaps===&lt;br /&gt;
&lt;br /&gt;
Go to the textures tab and make your UV/texture/team-colour map as &amp;quot;texture1&amp;quot; and your UV/glow/reflectivity map as &amp;quot;texture2&amp;quot;... it should show up correctly in the preview pane.&lt;br /&gt;
&lt;br /&gt;
===Exporting Your s3o===&lt;br /&gt;
Choose File&amp;gt;Save Model As then in the drop down select &amp;quot;s3o&amp;quot; and type an appropriate name. This model should be saved to your working directory, and a copy of it made to &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/objects3d/&lt;br /&gt;
&lt;br /&gt;
==Step 6: Lua files==&lt;br /&gt;
&lt;br /&gt;
===UnitName.lua===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For Reference visit [[Units:FBI]], but again, the easiest way to do this is to extract an existing mod and find the fbi for a unit that behaves similarly to the one you are trying to make and rename and modify it.&lt;br /&gt;
&lt;br /&gt;
Some More Specific Information Not Clear in the &amp;quot;Units:FBI&amp;quot; article:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name+&amp;quot; &amp;quot;+Description=Spring Display Name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you have the following settings:&lt;br /&gt;
&lt;br /&gt;
 Name=Tiger;&lt;br /&gt;
 Description=Fast Attack C.A.T.;&lt;br /&gt;
&lt;br /&gt;
The Tooltip will show &amp;quot;Tiger Fast Attack C.A.T.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BuildPic Defaults to UnitName.bmp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you leave out &amp;quot;BuildPic=filename.bmp;&amp;quot; Spring will look in /unitpics/ for a file called &amp;quot;UnitName.bmp&amp;quot; to use as your buildpic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ObjectName&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you want to use an s3o object, you will need to specify with &amp;quot;ObjectName=UnitName&#039;&#039;&#039;.S3O;&#039;&#039;&#039;&amp;quot; otherwise it will look for &amp;quot;UnitName.3do&amp;quot;.  Also, you don&#039;t have to use &amp;quot;UnitName&amp;quot; as the filename and, in fact, multiple Unit&#039;s fbi files can reference the same 3D models. It is easier, however, for people to figure out what you are doing in your mod if you follow the standards.&lt;br /&gt;
&lt;br /&gt;
Save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unitDef = {&lt;br /&gt;
  unitname           = [[arm_spider]],&lt;br /&gt;
  name               = [[Weaver]],&lt;br /&gt;
  description        = [[Cloaking Construction Spider, Builds at 9 m/s]],&lt;br /&gt;
  acceleration       = 0.15,&lt;br /&gt;
  bmcode             = [[1]],&lt;br /&gt;
  brakeRate          = 0.15,&lt;br /&gt;
  buildCostEnergy    = 230,&lt;br /&gt;
  buildCostMetal     = 230,&lt;br /&gt;
  buildDistance      = 80,&lt;br /&gt;
  builder            = true,&lt;br /&gt;
&lt;br /&gt;
  buildoptions       = {&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  buildPic           = [[arm_spider.png]],&lt;br /&gt;
  buildTime          = 230,&lt;br /&gt;
  canAttack          = false,&lt;br /&gt;
  canGuard           = true,&lt;br /&gt;
  canMove            = true,&lt;br /&gt;
  canPatrol          = true,&lt;br /&gt;
  canreclamate       = [[1]],&lt;br /&gt;
  canstop            = [[1]],&lt;br /&gt;
  category           = [[LAND UNARMED]],&lt;br /&gt;
  cloakCost          = 1,&lt;br /&gt;
  cloakCostMoving    = 2,&lt;br /&gt;
  corpse             = [[DEAD]],&lt;br /&gt;
&lt;br /&gt;
  customParams       = {&lt;br /&gt;
    description_bp = [[Aranha e de construÃƒÂ§?o, ConstrÃƒÂ³i a 6 m/s]],&lt;br /&gt;
    description_es = [[Ara?a de construcciÃƒÂ³n, construye a 6 m/s]],&lt;br /&gt;
    description_fi = [[Rakentaja/kaikuluotainkiipeilij?, rakentaa 6m/s nopeudella]],&lt;br /&gt;
    description_fr = [[Araign?e de Construction, Construit ? 6 m/s]],&lt;br /&gt;
    description_it = [[Ragno do costruzione occultante, costruisce a 6 m/s]],&lt;br /&gt;
    description_pl = [[Paj?k konstruktor, buduje z pr?dko?ci? 6m/s]],&lt;br /&gt;
    helptext       = [[The Weaver is a constructor that can climb over any obstacle and build defenses on high ground.]],&lt;br /&gt;
    helptext_bp    = [[Weaver ÃƒÂ© o construtor escalador camuflÃƒÂ¡vel de NOVA. Pode subir qualquer obstÃƒÂ¡culo, mas constrÃƒÂ³i mais devagar que construtores normais.]],&lt;br /&gt;
    helptext_es    = [[El Weaver es el constructor que puede treparse sobre qualquier obstÃƒÂ¡culo y construir defensas en terreno alto]],&lt;br /&gt;
    helptext_fi    = [[Weaver pystyy liikkumaan vaikeakulkuisimmassakin maastossa ja rakentamaan vaivatta my?s useimmille muille rakentajille saavuttamattomiin paikkoihin.]],&lt;br /&gt;
    helptext_fr    = [[Le weaver est un robot de construction tout terrain qui peut batir des d?fenses en terrain ?lev?.]],&lt;br /&gt;
    helptext_it    = [[Il Weaver ÃƒÂ© un costruttore che puo arrampicarsi su qualunque ostacolo e costruire difese nel terreno alto]],&lt;br /&gt;
    helptext_pl    = [[Weaver jest konstruktorem mog?cym wspina? si? po ka?dej powierzchni oraz posiadaj?cym mo?liwo?? maskowania si?]],&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  defaultmissiontype = [[Standby]],&lt;br /&gt;
  designation        = [[ARM-MLSPD]],&lt;br /&gt;
  energyMake         = 0.15,&lt;br /&gt;
  energyUse          = 0,&lt;br /&gt;
  explodeAs          = [[BIG_UNITEX]],&lt;br /&gt;
  footprintX         = 3,&lt;br /&gt;
  footprintZ         = 3,&lt;br /&gt;
  iconType           = [[builder]],&lt;br /&gt;
  mass               = 115,&lt;br /&gt;
  maxDamage          = 750,&lt;br /&gt;
  maxslope           = 16,&lt;br /&gt;
  maxSlope           = 72,&lt;br /&gt;
  maxVelocity        = 1.7,&lt;br /&gt;
  maxWaterDepth      = 22,&lt;br /&gt;
  metalMake          = 0.15,&lt;br /&gt;
  movementClass      = [[TKBOT3]],&lt;br /&gt;
  noAutoFire         = false,&lt;br /&gt;
  noChaseCategory    = [[TERRAFORM SATELLITE FIXEDWING GUNSHIP HOVER SHIP SWIM SUB LAND FLOAT SINK]],&lt;br /&gt;
  objectName         = [[ARMMLSPD]],&lt;br /&gt;
  radarDistanceJam   = 256,&lt;br /&gt;
  seismicSignature   = 16,&lt;br /&gt;
  selfDestructAs     = [[BIG_UNITEX]],&lt;br /&gt;
  showNanoSpray      = false,&lt;br /&gt;
  side               = [[ARM]],&lt;br /&gt;
  sightDistance      = 295,&lt;br /&gt;
  smoothAnim         = true,&lt;br /&gt;
  steeringmode       = [[1]],&lt;br /&gt;
  TEDClass           = [[CNSTR]],&lt;br /&gt;
  terraformSpeed     = 450,&lt;br /&gt;
  threed             = [[1]],&lt;br /&gt;
  turninplace        = 0,&lt;br /&gt;
  turnRate           = 1020,&lt;br /&gt;
  workerTime         = 9,&lt;br /&gt;
  zbuffer            = [[1]],&lt;br /&gt;
&lt;br /&gt;
  featureDefs        = {&lt;br /&gt;
&lt;br /&gt;
    DEAD  = {&lt;br /&gt;
      description      = [[Wreckage - Weaver]],&lt;br /&gt;
      blocking         = true,&lt;br /&gt;
      category         = [[arm_corpses]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[DEAD2]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[40]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[ARMMLSPD_dead]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    DEAD2 = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[HEAP]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    HEAP  = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 46,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 46,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return lowerkeys({ arm_spider = unitDef })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
&lt;br /&gt;
===modinfo.lua===&lt;br /&gt;
&lt;br /&gt;
modinfo.lua is a lua file that defines a number of things that are used when loading a mod, most of the information is self explanitory but basically what you are doing is defining what is going to show up in whatever mod-selection interface you use as well as what other files need to be loaded into memory in order for your mod to work.&lt;br /&gt;
&lt;br /&gt;
====Making a New Mod with your unit/units====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are starting from scratch and making your own mod. This is also good when you are just testing one unit to see if it works.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;MyMod&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		name = &amp;quot;My Mod&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;My Mod That I Made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.theplacepeoplecangetthelatestversionofyourmod.com&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			&amp;quot;Spring content v1&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Cursors&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Bitmaps&amp;quot;,&lt;br /&gt;
			-- Number of other content names this one replaces&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Adding Your Unit to an Existing Mod====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are adding new units to an existing mod (in this case XTA SE v066), this is good for adding units to the build tree of an existing mod or adding a whole new team.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- Description of the mod control file recognized by spring:&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;XTASE_MyUnits&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		name = &amp;quot;XTASEv0.66 with+My Units&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;xta_se_v066 with the cool tank I made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.fileuniverse.com/exactlocationblahblahblah&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			&amp;quot;XTA se v066&amp;quot;,&lt;br /&gt;
                        &amp;quot;Spring Cursors&amp;quot;,&lt;br /&gt;
                        &amp;quot;Spring content v1&amp;quot;,&lt;br /&gt;
			-- Number of other archives this one replaces&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are not depending on OTA files, you will have to supply your own cursors.&lt;br /&gt;
&lt;br /&gt;
There are some extra bits in these examples, but I work on the &amp;quot;better safe than sorry&amp;quot; principle... which is to wait for someone who knows what they are doing to fix my articles. &lt;br /&gt;
&lt;br /&gt;
You will want to save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
===armorDefs.lua===&lt;br /&gt;
&lt;br /&gt;
I&#039;m not exactly sure how this works, but the file needs to exist, so either steal one from another mod and modify it... or just make a file that looks like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local armorDefs = {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will want to save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata&lt;br /&gt;
&lt;br /&gt;
===sidedata.lua===&lt;br /&gt;
&lt;br /&gt;
Start by stealing the sidedata.lua file from your dependency mod if you have one, then edit it to include your units/side.&lt;br /&gt;
&lt;br /&gt;
Basically this file is in the form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local sideData = {&lt;br /&gt;
	[1] = {&lt;br /&gt;
		name      = &#039;Good Guys&#039;,&lt;br /&gt;
		startunit = &#039;GG_comm&#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are also additional &amp;quot;[X]&amp;quot; entries for each side/team/commander-choice available in the mod-selector you choose.&lt;br /&gt;
&lt;br /&gt;
You will save this file as lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata/&lt;br /&gt;
&lt;br /&gt;
===moveDefs.lua===&lt;br /&gt;
This file determines the footprint of your units, the angle of slopes they can climb and in how deep water they can drive. It contains several entries, all in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local moveDefs = {&lt;br /&gt;
	KBOT1 = { -- This is the name. Unit files refer to this name.&lt;br /&gt;
		footprintx = 1, -- This is how big the X dimension is of the footprint in Spring units probably?&lt;br /&gt;
		footprintz = 1, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxwaterdepth = 15, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxslope = 36, -- The maximum angle of slopes this unit can climb.&lt;br /&gt;
		crushstrength = 5, -- This determines if the unit/unit class can crush certain features&lt;br /&gt;
	},&lt;br /&gt;
	-- etc..&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sounds.lua===&lt;br /&gt;
This file refers to all the sounds your units make, so Spring knows which sound file is linked to what action. It contains entries in the following format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local Sounds = {&lt;br /&gt;
   SoundItems = {&lt;br /&gt;
      IncomingChat = {&lt;br /&gt;
         file = &amp;quot;sounds/nexuiz/talk.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
      },&lt;br /&gt;
      MultiSelect = {&lt;br /&gt;
         file = &amp;quot;sounds/ota/button9.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      MapPoint = {&lt;br /&gt;
         file = &amp;quot;sounds/bzflag/teamgrab.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      FailedCommand = {&lt;br /&gt;
         file = &amp;quot;sounds/openQuarz/pkup.wav&amp;quot;,&lt;br /&gt;
         gain = 0.75,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         in3d = false,&lt;br /&gt;
      },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Step 7:Adding a Build Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 96x96 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unitpics/ folder named either &amp;quot;UnitName.bmp&amp;quot; or whatever you specified in the &amp;quot;BuildPic=&amp;quot; line of your fbi.&lt;br /&gt;
&lt;br /&gt;
==Step 8:Adding a Side Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 16x16 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/sidepics/ folder named &amp;quot;teamname.bmp&amp;quot; or whatever you specified in the &amp;quot;name=&amp;quot; line of your SIDEDATA.TDF for each side/team you have added.&lt;br /&gt;
&lt;br /&gt;
==Step 9:Scriptor==&lt;br /&gt;
&lt;br /&gt;
===Stealing a Script===&lt;br /&gt;
Open someone else&#039;s script in scriptor that works the way you want your script to work, look at the top where it&#039;s talking about &amp;quot;piece names&amp;quot;... then change those piece names to be the piece names of your unit and do a find/replace to make all the places where those pieces show up to be your pieces too.  Compile it so its name is the same as the &amp;quot;UnitName=&amp;quot; value in your &amp;quot;UnitName.fbi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
XXreminder to someone to link to a proper scripting tutorial&lt;br /&gt;
&lt;br /&gt;
Put the bos and cob files for your unit script in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/scripts&lt;br /&gt;
&lt;br /&gt;
==Step 10:Compiling Your Mod==&lt;br /&gt;
&lt;br /&gt;
You may want to check your mod directory and make sure it follows the structure defined [[Mod_Development:Archives|here]].&lt;br /&gt;
&lt;br /&gt;
navigate to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt; and select everything and choose &amp;quot;add to archive &amp;lt;mod name&amp;gt;.7z&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
make a copy of this file called &amp;lt;mod name&amp;gt;v0.7z in your working directory so you don&#039;t screw anything up later, then make a copy of it called &amp;lt;mod name&amp;gt;.sd7 in the mods directory of spring.&lt;br /&gt;
&lt;br /&gt;
An alternative, added in more recent versions is the &amp;quot;.SDD&amp;quot; folder, to use this, copy the entire &amp;lt;mod name&amp;gt; folder in the mods directory of spring and rename it as &amp;quot;&amp;lt;mod name&amp;gt;.SDD&amp;quot;.  The advantage to the &amp;quot;.SDD&amp;quot; method is that you can tweak settings and add files without recompressing your mod all the time.  When it comes time to distribute your mod use &amp;quot;.sd7&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
EXAMPLES:&lt;br /&gt;
If your mod is called JoesMod you will have a file called &amp;quot;JoesMod.sd7&amp;quot; or a folder called &amp;quot;JoesMod.SDD&amp;quot; in your spring mods directory.&lt;br /&gt;
&lt;br /&gt;
==Step 11:Testing Your Mod==&lt;br /&gt;
Open Up your lobby client, pick your mod from the drop-down list of the games in host battle or singleplayer mode if your lobby supports it(if it doesn&#039;t show up you screwed up your modinfo.txt), choose your tiny map from the map list and press start.  If it doesn&#039;t break and your unit shows up, you have created all the neccessary files... yay!&lt;br /&gt;
&lt;br /&gt;
Gotchas:&lt;br /&gt;
*If it doesn&#039;t work, check you didn&#039;t zip the folder itself, but the contents, ie if you open mymod.sd7 with 7zip, you should see folders such as &amp;quot;unittextures&amp;quot; rather than a folder &amp;quot;mymod&amp;quot; containing unittextures.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod development]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16868</id>
		<title>Simple Game Tutorial</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Simple_Game_Tutorial&amp;diff=16868"/>
		<updated>2010-08-23T11:48:27Z</updated>

		<summary type="html">&lt;p&gt;Braindamage: use unitsync names, not filenames!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Until I Finish [[Mod Development]] is the place to go.&lt;br /&gt;
&lt;br /&gt;
This Tutorial Aims to get a person from knowing nothing about Spring to the point where they can create and edit mods.&lt;br /&gt;
&lt;br /&gt;
Right now I am working from memory so you may want to correct me when I&#039;m wrong, I will try to cross link from my summaries to the appropriate articles available in other places.&lt;br /&gt;
&lt;br /&gt;
I will not go too deep into making 3do&#039;s because they are old and dumb... but I&#039;ll try to make note of the differences here.&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know anything about scripting right now, so that section is likely to be sparse when I write it, I hope that someone will expand on it.&lt;br /&gt;
&lt;br /&gt;
=Book 1: The First Unit=&lt;br /&gt;
&lt;br /&gt;
==Step 1:Planning==&lt;br /&gt;
Who cares about planning, you know what you&#039;re doing... just come up with an idea for a mod... I made a chess set... if you don&#039;t have a real idea and just want to make a model show up in the game... then yeah... this is the place to start... I&#039;d do that if I were you.&lt;br /&gt;
&lt;br /&gt;
Another good thing to do at this point is to creat a &amp;quot;working directory&amp;quot;, and inside it create a directory with the name that your mod will have... after many headaches I decided it&#039;s best to put this in the root directory of your system so it&#039;s really easy to find when you are switching around back and forth between folders and keep having to find your files over and over again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Step 2:Getting The Tools==&lt;br /&gt;
You will need a bunch of stuff... here&#039;s the list (I assume you are using windows)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Want:&#039;&#039;&lt;br /&gt;
*[http://taspring.clan-sy.com/download.php Spring] - The main program, you will likely need this to test if you&#039;ve screwed up&lt;br /&gt;
*A Tiny Map (2x2) - to test your mod fast (suggest [http://www.fileuniverse.com/?p=showitem&amp;amp;ID=2534 Simple Chess Map])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Need:&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Program listings can be found here:&#039;&#039;&#039; &#039;&#039;&#039;[http://taspring.clan-sy.com/wiki/Map%2C_Mod%2C_And_Unit_Development_Programs Map, Mod, And Unit Development Programs]&#039;&#039;&#039;&lt;br /&gt;
*3D Modeling Program - &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Notepad - to edit all the miriad of text files&lt;br /&gt;
*A Graphical Editing Program - needs to handle RGBA TGAs (aka tga&#039;s with alpha channels), I suggest Photoshop if you have it, or The GIMP... needed for all of the texture making for UVmapping stuff... &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Upspring 1.3 - To convert your models to the approprite s3o format (if you want to fight with 3do builder, then go ahead... a good trick is to get your model into upspring first and adjust all the hierachy, then save it as an 3do... but why bother?). &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Scriptor - to make and compile your units &amp;quot;animation script&amp;quot;... or steal someone else&#039;s and make it work for your unit. &#039;&#039;&#039;See above link&#039;&#039;&#039;&lt;br /&gt;
*Compression Utility - (I suggest [http://www.7-zip.org/ 7zip] - even if you are using zip compression and not 7zip, it&#039;s still good to have)&lt;br /&gt;
&lt;br /&gt;
==Step 3:Making a 3D Model==&lt;br /&gt;
&lt;br /&gt;
Go into your 3D modelling program and make a 3D model, [http://taspring.clan-sy.com/w/images/b/b4/WingsCombine.PNG combine] all the objects and UV map the model, then separate it out into any parts that need to move independently of each other.  Then Export the UV map as an Image File and Export the whole thing as a 3ds file.  Put the original wings file, the UVMap image and the 3ds file into your working directory so you can find them later.&lt;br /&gt;
&lt;br /&gt;
Wings 3D UV Mapping tutorial has been started here - [[Units:CreateModel]]&lt;br /&gt;
&lt;br /&gt;
==Step 4:Fixing Your Images==&lt;br /&gt;
&lt;br /&gt;
[[Basic s3o unit making guide|This Article includes a UVMapping Guide]]&lt;br /&gt;
&lt;br /&gt;
Open up your UVMap in Photoshop (or whatever) go to the layer/chooser thingy and go to the Channels Tab, add a new layer (it should default to alpha) and fill it with 99% black so you can see your texture in upspring.  If you want to can paint the UVmap and put white (1% black) on the alpha channel where you want your team colours to show up (you can use something between 1% and 99% to get a blend of your team colour along with the texture... for example 50% will give you your texture with 50% of the team colour mixed in...)&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know how to do glow maps... XXreminder for someone to create a Glowmapping tutorial... you don&#039;t acctually need one for the model to show up.&lt;br /&gt;
&lt;br /&gt;
Save these images both in the working directory.&lt;br /&gt;
&lt;br /&gt;
Save a copy of these images in tga format into &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unittextures&lt;br /&gt;
&lt;br /&gt;
==Step 5:Upspring==&lt;br /&gt;
&lt;br /&gt;
===Importing Your 3ds===&lt;br /&gt;
Open Upspring 1.3, go to file&amp;gt;load model and navigate to and open your 3DS model you exported, you should see the model in upspring as a 3d mesh.  Go to the model tab and set the radius and height values to something other then zero... this defines where the health bar will show up, and more importantly, how big the collision sphere will be.&lt;br /&gt;
&lt;br /&gt;
You will also need to use all of the other tools on those tabs to resize and rotate and move your model to the right place... wings makes models that are 90 degrees off and about 30 times smaller than most spring models... make sure you click the &amp;quot;apply transform&amp;quot; button after any changes that you actually want to show up in the game.&lt;br /&gt;
&lt;br /&gt;
Also, you will want to make the hierachy work using the cut, paste, and add empty buttons.  You will need an object called &amp;quot;base&amp;quot; that all the other objects are connected to... the &amp;quot;origin object&amp;quot;... sometimes you get lucky and wings exports it properly... usually not.&lt;br /&gt;
&lt;br /&gt;
===Importing Your UV and Glowmaps===&lt;br /&gt;
&lt;br /&gt;
Go to the textures tab and make your UV/texture/team-colour map as &amp;quot;texture1&amp;quot; and your UV/glow/reflectivity map as &amp;quot;texture2&amp;quot;... it should show up correctly in the preview pane.&lt;br /&gt;
&lt;br /&gt;
===Exporting Your s3o===&lt;br /&gt;
Choose File&amp;gt;Save Model As then in the drop down select &amp;quot;s3o&amp;quot; and type an appropriate name. This model should be saved to your working directory, and a copy of it made to &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/objects3d/&lt;br /&gt;
&lt;br /&gt;
==Step 6: Lua files==&lt;br /&gt;
&lt;br /&gt;
===UnitName.lua===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For Reference visit [[Units:FBI]], but again, the easiest way to do this is to extract an existing mod and find the fbi for a unit that behaves similarly to the one you are trying to make and rename and modify it.&lt;br /&gt;
&lt;br /&gt;
Some More Specific Information Not Clear in the &amp;quot;Units:FBI&amp;quot; article:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name+&amp;quot; &amp;quot;+Description=Spring Display Name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you have the following settings:&lt;br /&gt;
&lt;br /&gt;
 Name=Tiger;&lt;br /&gt;
 Description=Fast Attack C.A.T.;&lt;br /&gt;
&lt;br /&gt;
The Tooltip will show &amp;quot;Tiger Fast Attack C.A.T.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BuildPic Defaults to UnitName.bmp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So if you leave out &amp;quot;BuildPic=filename.bmp;&amp;quot; Spring will look in /unitpics/ for a file called &amp;quot;UnitName.bmp&amp;quot; to use as your buildpic.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ObjectName&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you want to use an s3o object, you will need to specify with &amp;quot;ObjectName=UnitName&#039;&#039;&#039;.S3O;&#039;&#039;&#039;&amp;quot; otherwise it will look for &amp;quot;UnitName.3do&amp;quot;.  Also, you don&#039;t have to use &amp;quot;UnitName&amp;quot; as the filename and, in fact, multiple Unit&#039;s fbi files can reference the same 3D models. It is easier, however, for people to figure out what you are doing in your mod if you follow the standards.&lt;br /&gt;
&lt;br /&gt;
Save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unitDef = {&lt;br /&gt;
  unitname           = [[arm_spider]],&lt;br /&gt;
  name               = [[Weaver]],&lt;br /&gt;
  description        = [[Cloaking Construction Spider, Builds at 9 m/s]],&lt;br /&gt;
  acceleration       = 0.15,&lt;br /&gt;
  bmcode             = [[1]],&lt;br /&gt;
  brakeRate          = 0.15,&lt;br /&gt;
  buildCostEnergy    = 230,&lt;br /&gt;
  buildCostMetal     = 230,&lt;br /&gt;
  buildDistance      = 80,&lt;br /&gt;
  builder            = true,&lt;br /&gt;
&lt;br /&gt;
  buildoptions       = {&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  buildPic           = [[arm_spider.png]],&lt;br /&gt;
  buildTime          = 230,&lt;br /&gt;
  canAttack          = false,&lt;br /&gt;
  canGuard           = true,&lt;br /&gt;
  canMove            = true,&lt;br /&gt;
  canPatrol          = true,&lt;br /&gt;
  canreclamate       = [[1]],&lt;br /&gt;
  canstop            = [[1]],&lt;br /&gt;
  category           = [[LAND UNARMED]],&lt;br /&gt;
  cloakCost          = 1,&lt;br /&gt;
  cloakCostMoving    = 2,&lt;br /&gt;
  corpse             = [[DEAD]],&lt;br /&gt;
&lt;br /&gt;
  customParams       = {&lt;br /&gt;
    description_bp = [[Aranha e de construÃƒÂ§?o, ConstrÃƒÂ³i a 6 m/s]],&lt;br /&gt;
    description_es = [[Ara?a de construcciÃƒÂ³n, construye a 6 m/s]],&lt;br /&gt;
    description_fi = [[Rakentaja/kaikuluotainkiipeilij?, rakentaa 6m/s nopeudella]],&lt;br /&gt;
    description_fr = [[Araign?e de Construction, Construit ? 6 m/s]],&lt;br /&gt;
    description_it = [[Ragno do costruzione occultante, costruisce a 6 m/s]],&lt;br /&gt;
    description_pl = [[Paj?k konstruktor, buduje z pr?dko?ci? 6m/s]],&lt;br /&gt;
    helptext       = [[The Weaver is a constructor that can climb over any obstacle and build defenses on high ground.]],&lt;br /&gt;
    helptext_bp    = [[Weaver ÃƒÂ© o construtor escalador camuflÃƒÂ¡vel de NOVA. Pode subir qualquer obstÃƒÂ¡culo, mas constrÃƒÂ³i mais devagar que construtores normais.]],&lt;br /&gt;
    helptext_es    = [[El Weaver es el constructor que puede treparse sobre qualquier obstÃƒÂ¡culo y construir defensas en terreno alto]],&lt;br /&gt;
    helptext_fi    = [[Weaver pystyy liikkumaan vaikeakulkuisimmassakin maastossa ja rakentamaan vaivatta my?s useimmille muille rakentajille saavuttamattomiin paikkoihin.]],&lt;br /&gt;
    helptext_fr    = [[Le weaver est un robot de construction tout terrain qui peut batir des d?fenses en terrain ?lev?.]],&lt;br /&gt;
    helptext_it    = [[Il Weaver ÃƒÂ© un costruttore che puo arrampicarsi su qualunque ostacolo e costruire difese nel terreno alto]],&lt;br /&gt;
    helptext_pl    = [[Weaver jest konstruktorem mog?cym wspina? si? po ka?dej powierzchni oraz posiadaj?cym mo?liwo?? maskowania si?]],&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  defaultmissiontype = [[Standby]],&lt;br /&gt;
  designation        = [[ARM-MLSPD]],&lt;br /&gt;
  energyMake         = 0.15,&lt;br /&gt;
  energyUse          = 0,&lt;br /&gt;
  explodeAs          = [[BIG_UNITEX]],&lt;br /&gt;
  footprintX         = 3,&lt;br /&gt;
  footprintZ         = 3,&lt;br /&gt;
  iconType           = [[builder]],&lt;br /&gt;
  mass               = 115,&lt;br /&gt;
  maxDamage          = 750,&lt;br /&gt;
  maxslope           = 16,&lt;br /&gt;
  maxSlope           = 72,&lt;br /&gt;
  maxVelocity        = 1.7,&lt;br /&gt;
  maxWaterDepth      = 22,&lt;br /&gt;
  metalMake          = 0.15,&lt;br /&gt;
  movementClass      = [[TKBOT3]],&lt;br /&gt;
  noAutoFire         = false,&lt;br /&gt;
  noChaseCategory    = [[TERRAFORM SATELLITE FIXEDWING GUNSHIP HOVER SHIP SWIM SUB LAND FLOAT SINK]],&lt;br /&gt;
  objectName         = [[ARMMLSPD]],&lt;br /&gt;
  radarDistanceJam   = 256,&lt;br /&gt;
  seismicSignature   = 16,&lt;br /&gt;
  selfDestructAs     = [[BIG_UNITEX]],&lt;br /&gt;
  showNanoSpray      = false,&lt;br /&gt;
  side               = [[ARM]],&lt;br /&gt;
  sightDistance      = 295,&lt;br /&gt;
  smoothAnim         = true,&lt;br /&gt;
  steeringmode       = [[1]],&lt;br /&gt;
  TEDClass           = [[CNSTR]],&lt;br /&gt;
  terraformSpeed     = 450,&lt;br /&gt;
  threed             = [[1]],&lt;br /&gt;
  turninplace        = 0,&lt;br /&gt;
  turnRate           = 1020,&lt;br /&gt;
  workerTime         = 9,&lt;br /&gt;
  zbuffer            = [[1]],&lt;br /&gt;
&lt;br /&gt;
  featureDefs        = {&lt;br /&gt;
&lt;br /&gt;
    DEAD  = {&lt;br /&gt;
      description      = [[Wreckage - Weaver]],&lt;br /&gt;
      blocking         = true,&lt;br /&gt;
      category         = [[arm_corpses]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[DEAD2]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[40]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[ARMMLSPD_dead]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    DEAD2 = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featureDead      = [[HEAP]],&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 92,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 92,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    HEAP  = {&lt;br /&gt;
      description      = [[Debris - Weaver]],&lt;br /&gt;
      blocking         = false,&lt;br /&gt;
      category         = [[heaps]],&lt;br /&gt;
      damage           = 850,&lt;br /&gt;
      featurereclamate = [[smudge01]],&lt;br /&gt;
      footprintX       = 3,&lt;br /&gt;
      footprintZ       = 3,&lt;br /&gt;
      height           = [[4]],&lt;br /&gt;
      hitdensity       = [[100]],&lt;br /&gt;
      metal            = 46,&lt;br /&gt;
      object           = [[debris3x3b.s3o]],&lt;br /&gt;
      reclaimable      = true,&lt;br /&gt;
      reclaimTime      = 46,&lt;br /&gt;
      seqnamereclamate = [[tree1reclamate]],&lt;br /&gt;
      world            = [[All Worlds]],&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return lowerkeys({ arm_spider = unitDef })&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/units/&lt;br /&gt;
&lt;br /&gt;
===modinfo.lua===&lt;br /&gt;
&lt;br /&gt;
modinfo.lua is a lua file that defines a number of things that are used when loading a mod, most of the information is self explanitory but basically what you are doing is defining what is going to show up in whatever mod-selection interface you use as well as what other files need to be loaded into memory in order for your mod to work.&lt;br /&gt;
&lt;br /&gt;
====Making a New Mod with your unit/units====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are starting from scratch and making your own mod. This is also good when you are just testing one unit to see if it works.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;MyMod&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		name = &amp;quot;My Mod&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;MM&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;My Mod That I Made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.theplacepeoplecangetthelatestversionofyourmod.com&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			&amp;quot;Spring content v1&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Cursors&amp;quot;,&lt;br /&gt;
			&amp;quot;Spring Bitmaps&amp;quot;,&lt;br /&gt;
			-- Number of other content names this one replaces&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Adding Your Unit to an Existing Mod====&lt;br /&gt;
The following is an example of what will be in your modinfo.lua file if you are adding new units to an existing mod (in this case xta_se_v066.sdz), this is good for adding units to the build tree of an existing mod or adding a whole new team.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- Description of the mod control file recognized by spring:&lt;br /&gt;
return {&lt;br /&gt;
		-- The name is shown in the selection interface&lt;br /&gt;
		game = &amp;quot;XTASE_MyUnits&amp;quot;,&lt;br /&gt;
		shortGame = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		name = &amp;quot;XTASEv0.66 with+My Units&amp;quot;,&lt;br /&gt;
		shortName = &amp;quot;XTASEMU&amp;quot;,&lt;br /&gt;
		version = &amp;quot;4.0&amp;quot;,&lt;br /&gt;
		mutator = &amp;quot;Heroes&amp;quot;,&lt;br /&gt;
		-- These can be shown by the selection interface&lt;br /&gt;
		description = &amp;quot;xta_se_v066 with the cool tank I made&amp;quot;,&lt;br /&gt;
		url = &amp;quot;http://www.fileuniverse.com/exactlocationblahblahblah&amp;quot;,&lt;br /&gt;
		-- What kind of mod this is &lt;br /&gt;
		--  0 - Hidden (support mod that can&#039;t be selected, such as OTA_textures) &lt;br /&gt;
		--  1 - Normal, only one can be selected at a time &lt;br /&gt;
		--  2 - Addon, any number of these can be selected. Could be used &lt;br /&gt;
		--      for single units for example. &lt;br /&gt;
		--  others - perhaps mutators and addon races that can be &lt;br /&gt;
		--           enabled in addition to xta for example? &lt;br /&gt;
		modtype = &amp;quot;1&amp;quot;,&lt;br /&gt;
		-- Number of other archives this one depends on &lt;br /&gt;
		depend= {&lt;br /&gt;
			taenheter.sdz,&lt;br /&gt;
			springcontent.sdz,&lt;br /&gt;
			otacontent.sdz,&lt;br /&gt;
			tatextures.sdz,&lt;br /&gt;
			xta_se_v066.sdz,&lt;br /&gt;
			-- Number of other archives this one replaces&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are not depending on OTA files, you will have to supply your own cursors.&lt;br /&gt;
&lt;br /&gt;
There are some extra bits in these examples, but I work on the &amp;quot;better safe than sorry&amp;quot; principle... which is to wait for someone who knows what they are doing to fix my articles. &lt;br /&gt;
&lt;br /&gt;
You will want to save this file as plain text in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
===armorDefs.lua===&lt;br /&gt;
&lt;br /&gt;
I&#039;m not exactly sure how this works, but the file needs to exist, so either steal one from another mod and modify it... or just make a file that looks like this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local armorDefs = {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will want to save this file as a lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata&lt;br /&gt;
&lt;br /&gt;
===sidedata.lua===&lt;br /&gt;
&lt;br /&gt;
Start by stealing the sidedata.lua file from your dependency mod if you have one, then edit it to include your units/side.&lt;br /&gt;
&lt;br /&gt;
Basically this file is in the form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local sideData = {&lt;br /&gt;
	[1] = {&lt;br /&gt;
		name      = &#039;Good Guys&#039;,&lt;br /&gt;
		startunit = &#039;GG_comm&#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are also additional &amp;quot;[X]&amp;quot; entries for each side/team/commander-choice available in the mod-selector you choose.&lt;br /&gt;
&lt;br /&gt;
You will save this file as lua file in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/gamedata/&lt;br /&gt;
&lt;br /&gt;
===moveDefs.lua===&lt;br /&gt;
This file determines the footprint of your units, the angle of slopes they can climb and in how deep water they can drive. It contains several entries, all in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local moveDefs = {&lt;br /&gt;
	KBOT1 = { -- This is the name. Unit files refer to this name.&lt;br /&gt;
		footprintx = 1, -- This is how big the X dimension is of the footprint in Spring units probably?&lt;br /&gt;
		footprintz = 1, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxwaterdepth = 15, -- This is how big the Y dimension is of the footprint in Spring units probably?&lt;br /&gt;
		maxslope = 36, -- The maximum angle of slopes this unit can climb.&lt;br /&gt;
		crushstrength = 5, -- This determines if the unit/unit class can crush certain features&lt;br /&gt;
	},&lt;br /&gt;
	-- etc..&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sounds.lua===&lt;br /&gt;
This file refers to all the sounds your units make, so Spring knows which sound file is linked to what action. It contains entries in the following format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local Sounds = {&lt;br /&gt;
   SoundItems = {&lt;br /&gt;
      IncomingChat = {&lt;br /&gt;
         file = &amp;quot;sounds/nexuiz/talk.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
      },&lt;br /&gt;
      MultiSelect = {&lt;br /&gt;
         file = &amp;quot;sounds/ota/button9.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      MapPoint = {&lt;br /&gt;
         file = &amp;quot;sounds/bzflag/teamgrab.wav&amp;quot;,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         rolloff = 0.1,&lt;br /&gt;
      },&lt;br /&gt;
      FailedCommand = {&lt;br /&gt;
         file = &amp;quot;sounds/openQuarz/pkup.wav&amp;quot;,&lt;br /&gt;
         gain = 0.75,&lt;br /&gt;
         priority = 15,&lt;br /&gt;
         preload = true,&lt;br /&gt;
         in3d = false,&lt;br /&gt;
      },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==Step 7:Adding a Build Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 96x96 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/unitpics/ folder named either &amp;quot;UnitName.bmp&amp;quot; or whatever you specified in the &amp;quot;BuildPic=&amp;quot; line of your fbi.&lt;br /&gt;
&lt;br /&gt;
==Step 8:Adding a Side Pic==&lt;br /&gt;
&lt;br /&gt;
Add a 16x16 BMP to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/sidepics/ folder named &amp;quot;teamname.bmp&amp;quot; or whatever you specified in the &amp;quot;name=&amp;quot; line of your SIDEDATA.TDF for each side/team you have added.&lt;br /&gt;
&lt;br /&gt;
==Step 9:Scriptor==&lt;br /&gt;
&lt;br /&gt;
===Stealing a Script===&lt;br /&gt;
Open someone else&#039;s script in scriptor that works the way you want your script to work, look at the top where it&#039;s talking about &amp;quot;piece names&amp;quot;... then change those piece names to be the piece names of your unit and do a find/replace to make all the places where those pieces show up to be your pieces too.  Compile it so its name is the same as the &amp;quot;UnitName=&amp;quot; value in your &amp;quot;UnitName.fbi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
XXreminder to someone to link to a proper scripting tutorial&lt;br /&gt;
&lt;br /&gt;
Put the bos and cob files for your unit script in &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt;/scripts&lt;br /&gt;
&lt;br /&gt;
==Step 10:Compiling Your Mod==&lt;br /&gt;
&lt;br /&gt;
You may want to check your mod directory and make sure it follows the structure defined [[Mod_Development:Archives|here]].&lt;br /&gt;
&lt;br /&gt;
navigate to your &amp;lt;working directory&amp;gt;/&amp;lt;mod name&amp;gt; and select everything and choose &amp;quot;add to archive &amp;lt;mod name&amp;gt;.7z&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
make a copy of this file called &amp;lt;mod name&amp;gt;v0.7z in your working directory so you don&#039;t screw anything up later, then make a copy of it called &amp;lt;mod name&amp;gt;.sd7 in the mods directory of spring.&lt;br /&gt;
&lt;br /&gt;
An alternative, added in more recent versions is the &amp;quot;.SDD&amp;quot; folder, to use this, copy the entire &amp;lt;mod name&amp;gt; folder in the mods directory of spring and rename it as &amp;quot;&amp;lt;mod name&amp;gt;.SDD&amp;quot;.  The advantage to the &amp;quot;.SDD&amp;quot; method is that you can tweak settings and add files without recompressing your mod all the time.  When it comes time to distribute your mod use &amp;quot;.sd7&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
EXAMPLES:&lt;br /&gt;
If your mod is called JoesMod you will have a file called &amp;quot;JoesMod.sd7&amp;quot; or a folder called &amp;quot;JoesMod.SDD&amp;quot; in your spring mods directory.&lt;br /&gt;
&lt;br /&gt;
==Step 11:Testing Your Mod==&lt;br /&gt;
Open Up your lobby client, pick your mod from the drop-down list of the games in host battle or singleplayer mode if your lobby supports it(if it doesn&#039;t show up you screwed up your modinfo.txt), choose your tiny map from the map list and press start.  If it doesn&#039;t break and your unit shows up, you have created all the neccessary files... yay!&lt;br /&gt;
&lt;br /&gt;
Gotchas:&lt;br /&gt;
*If it doesn&#039;t work, check you didn&#039;t zip the folder itself, but the contents, ie if you open mymod.sd7 with 7zip, you should see folders such as &amp;quot;unittextures&amp;quot; rather than a folder &amp;quot;mymod&amp;quot; containing unittextures.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod development]]&lt;/div&gt;</summary>
		<author><name>Braindamage</name></author>
	</entry>
</feed>