<?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=Hokomoko</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=Hokomoko"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Hokomoko"/>
	<updated>2026-11-08T22:53:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2323</id>
		<title>Authors</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2323"/>
		<updated>2019-10-26T20:03:28Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Special Thanks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Authors=&lt;br /&gt;
&lt;br /&gt;
Spring (formerly TASpring) was originally written by the Swedish clan SY,&lt;br /&gt;
and later extended by a bunch of other people, some of whom are listed&lt;br /&gt;
here (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
==Active==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[User:abma|abma]]&#039;&#039;&#039; &#039;&#039;Python AI Interface, installer, infrastructure, tester&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[User:hokomoko|hokomoko]]&#039;&#039;&#039; &#039;&#039;Serialisation, simulation, optimisations, bug-fixes&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;jK&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, sound, OpenMP, OS related&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Kloot&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, bug-fixes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Retired==&lt;br /&gt;
* Auswaschbar (Karl-Robert Ernst)&lt;br /&gt;
* fnordia&lt;br /&gt;
* &#039;&#039;&#039;[[User:hoijui|hoijui]]&#039;&#039;&#039; &#039;&#039;AI, build-system, installer, headless, sound&#039;&#039;&lt;br /&gt;
* imbaczek (Marek Baczynski)&lt;br /&gt;
* jcnossen&lt;br /&gt;
* SJ&lt;br /&gt;
* Tobi (Tobi Vollebregt) &#039;&#039;releases, buildbot, simulation, Lua&#039;&#039;&lt;br /&gt;
* [[User:Tim_Blokdijk|tim blokdijk]]&lt;br /&gt;
* trepan&lt;br /&gt;
* victor&lt;br /&gt;
* xiphux&lt;br /&gt;
* zerver &#039;&#039;GFX, simulation, Lua, multithreaded&#039;&#039;&lt;br /&gt;
* cleanrock &#039;&#039;GFX, bug-fixes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Special Thanks==&lt;br /&gt;
Additionally for significant contributions to the spring engine or the community, special gratitude goes to (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
* Beherith&lt;br /&gt;
* betalord&lt;br /&gt;
* bibim (Yann Riou)&lt;br /&gt;
* BrainDamage&lt;br /&gt;
* colorblind (Teake Nutma)&lt;br /&gt;
* dansan (for hosting replays.springrts.com)&lt;br /&gt;
* det&lt;br /&gt;
* eriatarka&lt;br /&gt;
* FLOZi (Craig Lawrence)&lt;br /&gt;
* [https://github.com/gajop gajop (Gajo Petrovic)]&lt;br /&gt;
* hughperkins (Hugh Perkins)&lt;br /&gt;
* ILMTitan&lt;br /&gt;
* initram&lt;br /&gt;
* KDR_11k&lt;br /&gt;
* koshi&lt;br /&gt;
* Krogothe&lt;br /&gt;
* M2&lt;br /&gt;
* MadrMan&lt;br /&gt;
* Nathaniel Smith&lt;br /&gt;
* Nicolas Brodu&lt;br /&gt;
* rattle&lt;br /&gt;
* satirik&lt;br /&gt;
* semi&lt;br /&gt;
* smoth&lt;br /&gt;
* SpliFF&lt;br /&gt;
* tizbac (Tiziano Bacocco)&lt;br /&gt;
* quantum&lt;br /&gt;
* zenzike (Nicolas Wu)&lt;br /&gt;
* zizu&lt;br /&gt;
* zydox (for sharing A LOT of CPU power for running the validation test / buildslave)&lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
&lt;br /&gt;
NEVER send bug reports, help- and feature-requests directly to the&lt;br /&gt;
persons in this list, use the [http://springrts.com/mantis/ bugtracker] or the [http://springrts.com/phpbb/ forum] instead.&lt;br /&gt;
Of course you are free to write mails about donating.&lt;br /&gt;
&lt;br /&gt;
For additions/corrections to the list, please post in the community forum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Engine Dev]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5826</id>
		<title>Donations</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5826"/>
		<updated>2019-06-26T22:16:09Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Server costs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Donations are handled by [[Authors#Active|Kloot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bitcoin ==&lt;br /&gt;
[[Image:Bitcoin_logo.png|50px|link=bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]]&lt;br /&gt;
[bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]&lt;br /&gt;
([https://springrts.com/phpbb/viewtopic.php?f=86&amp;amp;t=32878&amp;amp;p=564309#p564309 Source])&lt;br /&gt;
&lt;br /&gt;
(sorry, no other options possible atm)&lt;br /&gt;
&lt;br /&gt;
The Donation(s) try to cover the costs of our [https://springrts.com/wiki/Spring:Organization Organization] which indirectly help [[Authors|us]] develop the spring engine!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server costs==&lt;br /&gt;
&lt;br /&gt;
currently [https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=32932&amp;amp;p=564906 60€ / year] [https://springrts.com/phpbb/viewtopic.php?f=38&amp;amp;t=32711 since 2014.11.05].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Year !! Expense (EUR) !! Date !! Income (EUR)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2014 || 10 || || &lt;br /&gt;
|-&lt;br /&gt;
| 2015 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2016 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2017 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 60 || 2018.03.13 || [https://springrts.com/phpbb/viewtopic.php?p=585298#p585298 161]&lt;br /&gt;
|-&lt;br /&gt;
| 2019 || 60 || 2019.03.24 || [https://springrts.com/phpbb/viewtopic.php?f=64&amp;amp;t=39261 15]&lt;br /&gt;
|-&lt;br /&gt;
|      ||    || 2019.04.01 || [https://springrts.com/phpbb/viewtopic.php?f=64&amp;amp;p=590470#p590469 200]&lt;br /&gt;
|-&lt;br /&gt;
|      ||    || 2019.06.26 || [https://springrts.com/phpbb/viewtopic.php?p=591596#p591596 15]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;310&#039;&#039;&#039; || &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;391&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5824</id>
		<title>Donations</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5824"/>
		<updated>2019-03-24T21:30:05Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Server costs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Donations are handled by [[Authors#Active|Kloot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bitcoin ==&lt;br /&gt;
[[Image:Bitcoin_logo.png|50px|link=bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]]&lt;br /&gt;
[bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]&lt;br /&gt;
([https://springrts.com/phpbb/viewtopic.php?f=86&amp;amp;t=32878&amp;amp;p=564309#p564309 Source])&lt;br /&gt;
&lt;br /&gt;
(sorry, no other options possible atm)&lt;br /&gt;
&lt;br /&gt;
The Donation(s) try to cover the costs of our [https://springrts.com/wiki/Spring:Organization Organization] which indirectly help [[Authors|us]] develop the spring engine!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server costs==&lt;br /&gt;
&lt;br /&gt;
currently [https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=32932&amp;amp;p=564906 60€ / year] [https://springrts.com/phpbb/viewtopic.php?f=38&amp;amp;t=32711 since 2014.11.05].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Year !! Expense (EUR) !! Date !! Income (EUR)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2014 || 10 || || &lt;br /&gt;
|-&lt;br /&gt;
| 2015 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2016 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2017 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 60 || 2018.03.13 || [https://springrts.com/phpbb/viewtopic.php?p=585298#p585298 161]&lt;br /&gt;
|-&lt;br /&gt;
| 2019 || 60 || 2019.03.24 || [https://springrts.com/phpbb/viewtopic.php?f=64&amp;amp;t=39261 15]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;310&#039;&#039;&#039; || &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;176&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5823</id>
		<title>Donations</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5823"/>
		<updated>2019-03-24T21:24:42Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Server costs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Donations are handled by [[Authors#Active|Kloot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bitcoin ==&lt;br /&gt;
[[Image:Bitcoin_logo.png|50px|link=bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]]&lt;br /&gt;
[bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]&lt;br /&gt;
([https://springrts.com/phpbb/viewtopic.php?f=86&amp;amp;t=32878&amp;amp;p=564309#p564309 Source])&lt;br /&gt;
&lt;br /&gt;
(sorry, no other options possible atm)&lt;br /&gt;
&lt;br /&gt;
The Donation(s) try to cover the costs of our [https://springrts.com/wiki/Spring:Organization Organization] which indirectly help [[Authors|us]] develop the spring engine!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server costs==&lt;br /&gt;
&lt;br /&gt;
currently [https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=32932&amp;amp;p=564906 60€ / year] [https://springrts.com/phpbb/viewtopic.php?f=38&amp;amp;t=32711 since 2014.11.05].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Year !! Expense (EUR) !! Date !! Income (EUR)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2014 || 10 || || &lt;br /&gt;
|-&lt;br /&gt;
| 2015 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2016 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2017 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 60 || 2018.03.13 || [https://springrts.com/phpbb/viewtopic.php?p=585298#p585298 161]&lt;br /&gt;
|-&lt;br /&gt;
| 2019 || 60 || 2018.03.24 || [https://springrts.com/phpbb/viewtopic.php?f=64&amp;amp;t=39261 15]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;310&#039;&#039;&#039; || &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;176&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2322</id>
		<title>Authors</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2322"/>
		<updated>2019-03-19T18:53:02Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Authors=&lt;br /&gt;
&lt;br /&gt;
Spring (formerly TASpring) was originally written by the Swedish clan SY,&lt;br /&gt;
and later extended by a bunch of other people, some of whom are listed&lt;br /&gt;
here (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
==Active==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[User:abma|abma]]&#039;&#039;&#039; &#039;&#039;Python AI Interface, installer, infrastructure, tester&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[User:hokomoko|hokomoko]]&#039;&#039;&#039; &#039;&#039;Serialisation, simulation, optimisations, bug-fixes&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;jK&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, sound, OpenMP, OS related&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Kloot&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, bug-fixes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Retired==&lt;br /&gt;
* Auswaschbar (Karl-Robert Ernst)&lt;br /&gt;
* fnordia&lt;br /&gt;
* &#039;&#039;&#039;[[User:hoijui|hoijui]]&#039;&#039;&#039; &#039;&#039;AI, build-system, installer, headless, sound&#039;&#039;&lt;br /&gt;
* imbaczek (Marek Baczynski)&lt;br /&gt;
* jcnossen&lt;br /&gt;
* SJ&lt;br /&gt;
* Tobi (Tobi Vollebregt) &#039;&#039;releases, buildbot, simulation, Lua&#039;&#039;&lt;br /&gt;
* [[User:Tim_Blokdijk|tim blokdijk]]&lt;br /&gt;
* trepan&lt;br /&gt;
* victor&lt;br /&gt;
* xiphux&lt;br /&gt;
* zerver &#039;&#039;GFX, simulation, Lua, multithreaded&#039;&#039;&lt;br /&gt;
* cleanrock &#039;&#039;GFX, bug-fixes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Special Thanks==&lt;br /&gt;
Additionally for significant contributions to the spring engine or the community, special gratitude goes to (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
* Beherith&lt;br /&gt;
* betalord&lt;br /&gt;
* bibim (Yann Riou)&lt;br /&gt;
* BrainDamage&lt;br /&gt;
* colorblind (Teake Nutma)&lt;br /&gt;
* dansan (for hosting replays.springrts.com)&lt;br /&gt;
* det&lt;br /&gt;
* eriatarka&lt;br /&gt;
* FLOZi (Craig Lawrence)&lt;br /&gt;
* [https://github.com/gajop gajop (Gajo Petrovic)]&lt;br /&gt;
* hughperkins (Hugh Perkins)&lt;br /&gt;
* ILMTitan&lt;br /&gt;
* initram&lt;br /&gt;
* KDR_11k&lt;br /&gt;
* koshi&lt;br /&gt;
* Krogothe&lt;br /&gt;
* M2&lt;br /&gt;
* MadrMan&lt;br /&gt;
* Nathaniel Smith&lt;br /&gt;
* Nicolas Brodu&lt;br /&gt;
* rattle&lt;br /&gt;
* satirik&lt;br /&gt;
* semi&lt;br /&gt;
* smoth&lt;br /&gt;
* SpliFF&lt;br /&gt;
* quantum&lt;br /&gt;
* zenzike (Nicolas Wu)&lt;br /&gt;
* zizu&lt;br /&gt;
* zydox (for sharing A LOT of CPU power for running the validation test / buildslave)&lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
&lt;br /&gt;
NEVER send bug reports, help- and feature-requests directly to the&lt;br /&gt;
persons in this list, use the [http://springrts.com/mantis/ bugtracker] or the [http://springrts.com/phpbb/ forum] instead.&lt;br /&gt;
Of course you are free to write mails about donating.&lt;br /&gt;
&lt;br /&gt;
For additions/corrections to the list, please post in the community forum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Engine Dev]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5822</id>
		<title>Donations</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Donations&amp;diff=5822"/>
		<updated>2019-01-03T12:32:23Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Donations are handled by [[Authors#Active|Kloot]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bitcoin ==&lt;br /&gt;
[[Image:Bitcoin_logo.png|50px|link=bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]]&lt;br /&gt;
[bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB bitcoin:12WLzbiRjT52satsr8hT2WyYQpP9sWxSQB]&lt;br /&gt;
([https://springrts.com/phpbb/viewtopic.php?f=86&amp;amp;t=32878&amp;amp;p=564309#p564309 Source])&lt;br /&gt;
&lt;br /&gt;
(sorry, no other options possible atm)&lt;br /&gt;
&lt;br /&gt;
The Donation(s) try to cover the costs of our [https://springrts.com/wiki/Spring:Organization Organization] which indirectly help [[Authors|us]] develop the spring engine!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server costs==&lt;br /&gt;
&lt;br /&gt;
currently [https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=32932&amp;amp;p=564906 60€ / year] [https://springrts.com/phpbb/viewtopic.php?f=38&amp;amp;t=32711 since 2014.11.05].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Year !! Expense (EUR) !! Date !! Income (EUR)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2014 || 10 || 2018.03.13 || [https://springrts.com/phpbb/viewtopic.php?p=585298#p585298 161]&lt;br /&gt;
|-&lt;br /&gt;
| 2015 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2016 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2017 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2019 || 60 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;310&#039;&#039;&#039; || &#039;&#039;&#039;Sum&#039;&#039;&#039;  || &#039;&#039;&#039;161&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Games&amp;diff=9100</id>
		<title>Games</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Games&amp;diff=9100"/>
		<updated>2018-04-27T08:46:56Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: equalise formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__There are a number of games made for the Spring Engine. Some of the more popular ones are listed below, sorted by their terms of use. &amp;lt;!--(/license schemes?)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download games automatically, using your lobby (see [[Read_Me_First|Read Me First]]). Some games also offer a stand-alone installer.&lt;br /&gt;
&lt;br /&gt;
=Open Source=&lt;br /&gt;
&#039;&#039;These games are all free to download and play and may be open to modifications, however, be sure to read the licenses before doing so.&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt;[https://zero-k.info/ Zero-K]&amp;lt;/h2&amp;gt;&lt;br /&gt;
([https://github.com/ZeroK-RTS/Zero-K/blob/master/legal.txt GPL, PD])&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Zero-k_image.jpg|300px|link=https://zero-k.info/]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Zero-K is a fast, competitive game with a focus on a streamlined economy and advanced interface that takes the focus off tedious tasks and back on the action. A huge roster of interesting, unique units and a variety of unit abilities provides tremendous tactical and strategic depth to the game. [https://zero-k.info Download link]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt;[http://spring1944.net/ Spring: 1944]&amp;lt;/h2&amp;gt;([https://github.com/spring1944/spring1944/blob/master/docs/License.txt CC-BY-NC])&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:S44_tigers.jpg|300px|link=http://spring1944.net/]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Spring:1944 is a WWII themed game with eight fully functional armies (US, Germany, USSR, Britain, Japan, Italy, Hungary, Sweden), period-accurate units and strengths. Realism comes second only to creating a game that is fun and accessible to play.&lt;br /&gt;
|-&lt;br /&gt;
|  | &amp;lt;h2&amp;gt;[https://www.evolutionrts.info Evolution RTS]&amp;lt;/h2&amp;gt;([https://creativecommons.org/licenses/by-nc-nd/3.0/us/ CC-BY-SA])&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Evoimg.jpg|300px|link=https://www.evolutionrts.info]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | A new war is brewing. A violent conflict, between the Six Colonies, each one convinced that it was in the right, each one sure of its own ability to defeat its enemies. But they need Generals. They need soldiers. They need you.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt;[[Kernel Panic]]&amp;lt;/h2&amp;gt;([[Kernel_Panic#License:|FOSS, with only 2 FOSS maps]])&amp;lt;!-- Since you should be able to remove those, I wonâ€™t mark it as non-free. Other maps have non-free license or no license at all.) --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kernel_Panic_3.4.jpg|300px|link=Kernel Panic]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | A game based around combat &#039;&#039;&#039;inside&#039;&#039;&#039; a computer, with 3 unique sides: the System, the Hacker and the Network waging war in a matrix of DOOM! No resource economy exists in KP, with the only constraints being time and space.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt;[http://www.moddb.com/games/conflict-terra Conflict Terra]&amp;lt;/h2&amp;gt;([http://code.google.com/p/conflictterra/source/browse/games/CT/License.txt FOSS])&amp;lt;!-- The sounds from EvoRTS were removed, so we&#039;re clean now. --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:CT_Hojos.png|300px|link=http://www.moddb.com/games/conflict-terra]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | A unique game with heavy emphasis on mobility and featuring Spring&#039;s first major &amp;quot;collect and drop-off&amp;quot; economy, Conflict Terra boasts a distinctive art style.  Play as one of two factions in an ever-changing battlefield as you struggle to come out on top.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt;[https://springfiles.com/spring/games/edge-1 On The Edge]&amp;lt;/h2&amp;gt;  (GPL, [https://creativecommons.org/licenses/by-nc-sa/3.0/us/ CC-BY-NC-SA])&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:start3.jpg|300px|link=https://springfiles.com/spring/games/edge-1]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | First Spring MOBA with unique pre-game hero setup. Under heavy development. How to setup working the game read on [http://springrts.com/phpbb/viewtopic.php?f=55&amp;amp;t=31476 On The Edge forum thread]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt;[http://www.metalfactions.pt Metal Factions]&amp;lt;/h2&amp;gt;&lt;br /&gt;
([http://www.metalfactions.pt/about.html#license CC-BY-ND, with GPL/PD code])&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Mf_spring_wiki.jpg|300px|link=http://www.metalfactions.pt]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | An evolving game that started as a TA mod and currently features four factions: AVEN, GEAR, CLAW and SPHERE. Commanders can morph to fit into different play styles and be easily revived. Economy scaling is more strictly tied to map control. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt;[http://www.indiedb.com/games/the-cursed The Cursed]&amp;lt;/h2&amp;gt;&lt;br /&gt;
([https://creativecommons.org/licenses/by-nc-sa/4.0 CC-BY-NC-SA])&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:cursed_logo.jpg|300px|link=http://www.indiedb.com/games/the-cursed]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | The game is about bones, undead, demons, space marines and magic settled in a futuristic environment. It is a fresh   mixture of gameplay elements from many popular RTS games like Starcraft and C&amp;amp;C.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Proprietary=&lt;br /&gt;
&#039;&#039;These games may or may not be free to play. Modifying their content (i.e. the art assets) is not allowed without the game authors explicit permission, although the code is GPL and some games include large GPL-friendly content collections.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt; [https://springrts.com/phpbb/viewforum.php?f=46 Star Wars: Imperial Winter] &amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Imperial Winter assault.jpg|300px|link=https://springrts.com/phpbb/viewforum.php?f=46]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | A Star Wars themed game set in the troubled post-Return of the Jedi era.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;h2&amp;gt; [https://springrts.com/phpbb/viewforum.php?f=69 Journeywar] &amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:JwLogo.jpg|300px|link=https://springrts.com/phpbb/viewtopic.php?f=69&amp;amp;t=23275&amp;amp;start=1180]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  Journeywar is the final battle between Combine and Exobiotics. Join the fight and rediscover the HL- Universe from a new, strategic perspective. Download in Springlogbby as jw:test archive.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=TA-derived=&lt;br /&gt;
&#039;&#039;At least parts of these games are derived from data of the  Total Annihilation game (copyright Atari). As such, their distribution is potentially in breach of copyright laws and therefore not officially endorsed by the Spring RTS team.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;h2&amp;gt; [https://balancedannihilation.com Balanced Annihilation] &amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:BAScreenShot.jpg|300px|link=https://balancedannihilation.com]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Balanced Annihilation (BA) is a mature game and new versions feature only minor balance tweaks.&lt;br /&gt;
&lt;br /&gt;
BA gameplay develops in stages of progressively heavier units with a growing economy. Many strategies are viable in BA, including focusing on map control, aggression, defense, air power, sea power, or mobility.&lt;br /&gt;
Go to [https://balancedannihilation.com BA Oficial Website] for more info!&lt;br /&gt;
|-&lt;br /&gt;
|  &amp;lt;h2&amp;gt; [https://springfiles.com/spring/games/tech-annihilation-8 Tech Annihilation] &amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Tech_Annihilation.png|300px|link=https://springfiles.com/spring/games/tech-annihilation-8]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |This Game is bigger, greater and more epic! Tech your Commander from a tiny Commander to a Galactic Commander! (by &#039;&#039;[BoS]Senna&#039;&#039;, currently no homepage)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;h2&amp;gt;[http://nota.machys.net/downloads NOTA]&amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:notAgame02.jpg|300px|link=http://nota.machys.net/downloads]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Not Original Total Annihilation is a rethink of the Total Annihilation universe with a focus on strategic, base oriented gameplay. With its revised unit scale, huge battles erupt engaging hundreds of units and scores of unit types. NOTA&#039;s completely rethought air and sea gameplay forces participation in all elements and places the tide of conflict in your hands.&lt;br /&gt;
|-&lt;br /&gt;
|  &amp;lt;h2&amp;gt; [[XTA]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Screen508_s.jpg|300px|link=XTA]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Originally developed as a Total Annihilation game by the Swedish Yankspankers, XTA is the Original Public Game released with first versions of Spring. Development of this game by the SYs has stopped a while ago, but it is still played and actively developed by the community.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Installing Games in Spring=&lt;br /&gt;
Quite a few of the games listed above come with standalone installers, which makes things easy. Check their website to find out! Otherwise a lobby such as [[SpringLobby]] will download everything for you when you join a game room.&lt;br /&gt;
&lt;br /&gt;
Games can also be downloaded manually as .sdz/.sd7 files, for example &#039;&#039;BA750&#039;&#039;&#039;&#039;&#039;.sd7&#039;&#039;&#039; or &#039;&#039;XTA&#039;&#039;&#039;&#039;&#039;.sdz&#039;&#039;&#039;, and placed into &#039;&#039;...\My Documents\My Games\Spring\Games\&#039;&#039; or &#039;&#039;...\Spring\games\&#039;&#039; folder (&#039;&#039;~/.spring/games/&#039;&#039; on Linux/Unix/Mac). Read the advice on [[Read_Me_First|this page]] if your lobby does not find your games.&lt;br /&gt;
You may install multiple games in the same engine installation. The same goes for [[Maps]]. Place them into a folder called maps in  the same folder where the games folder is.&lt;br /&gt;
&lt;br /&gt;
Still not enough Games? There are [[Getting_Spring_Content_and_Links|some more]], not listed here or make your [[Game_and_Unit_development|own Game]]!&lt;br /&gt;
&lt;br /&gt;
[[Category: Games]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Environments&amp;diff=10818</id>
		<title>Lua:Environments</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Environments&amp;diff=10818"/>
		<updated>2017-12-22T16:46:25Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Interfaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Environments ==&lt;br /&gt;
Here is an exhaustive list of the different lua environments within Spring, roughly in execution order as a game is loaded.&lt;br /&gt;
=== LuaMenu === &lt;br /&gt;
Introduced in 104.0, a stripped down environment that starts before the game is loaded and persists through reload.&lt;br /&gt;
=== LuaParser ===&lt;br /&gt;
Minimal environment used to parse and load definition files.&lt;br /&gt;
=== LuaIntro === &lt;br /&gt;
Introduced in 95.0, to allow visual customisation of the loading process.&lt;br /&gt;
=== LuaRules (synced) ===&lt;br /&gt;
The main environment for synced game-controlling mechanics (&amp;quot;gadgets&amp;quot;).&lt;br /&gt;
=== LuaRules (unsynced) ===&lt;br /&gt;
The main environment for unsynced game effects, rendering, UI etc. (&amp;quot;gadgets&amp;quot;)&lt;br /&gt;
=== LuaGaia (synced) ===&lt;br /&gt;
As LuaRules (synced) but for maps.&lt;br /&gt;
=== LuaGaia (unsynced) ===&lt;br /&gt;
As LuaRules (unsynced) but for maps.&lt;br /&gt;
=== LuaUI ===&lt;br /&gt;
The main environment for toggleable UI elements and controls (&amp;quot;widgets&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Interfaces == &lt;br /&gt;
The following table demonstrates which interfaces are available to each environment.&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em; border: 1px #aaa solid; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaMenu&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaIntro&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaParser&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaRules/Gaia&amp;lt;br&amp;gt;&amp;lt;font style=&amp;quot;font-size:80%&amp;quot;&amp;gt;(synced)&amp;lt;/font&amp;gt;&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaRules/Gaia&amp;lt;br&amp;gt;&amp;lt;font style=&amp;quot;font-size:80%&amp;quot;&amp;gt;(unsynced)&amp;lt;/font&amp;gt;&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaUI&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstGame]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstEngine]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstPlatform]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnitDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_WeaponDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_FeatureDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstCOB]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_CMDs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnsyncedRead]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnsyncedCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_SyncedRead]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +**&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_SyncedCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_MoveCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_PathFinder]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_OpenGL_Api]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_GLSL_Api]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_FBO_and_RBO]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnitRendering ]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Fonts]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstGL]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_VFS]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +*&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Scream]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_BitOps]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_MathExtra]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Socket]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em; border: 1px #aaa solid; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | *&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| only VFS.ZIP_ONLY&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | **&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| with special LOS handling and decoy unit handling&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ***&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| stripped down environment with certain functions removed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Category:Lua&amp;diff=23484</id>
		<title>Category:Lua</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Category:Lua&amp;diff=23484"/>
		<updated>2017-12-22T14:53:38Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; Lua Category&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;Lua Interfaces&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em; border: 1px #aaa solid; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaUI&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaRules&amp;lt;br&amp;gt;&amp;lt;font style=&amp;quot;font-size:80%&amp;quot;&amp;gt;(unsynced)&amp;lt;/font&amp;gt;&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaRules&amp;lt;br&amp;gt;&amp;lt;font style=&amp;quot;font-size:80%&amp;quot;&amp;gt;(synced)&amp;lt;/font&amp;gt;&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaMenu&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstGame]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstEngine]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstPlatform]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnitDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_WeaponDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_FeatureDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstCOB]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_CMDs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnsyncedRead]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnsyncedCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_SyncedRead]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +**&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_SyncedCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_MoveCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_PathFinder]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_OpenGL_Api]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_GLSL_Api]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_FBO_and_RBO]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnitRendering ]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Fonts]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstGL]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_VFS]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +*&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Scream]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_BitOps]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_MathExtra]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Socket]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em; border: 1px #aaa solid; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | *&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| only VFS.ZIP_ONLY&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | **&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| with special LOS handling and decoy unit handling&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ***&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| stripped down environment with certain functions removed&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Linux&amp;diff=3407</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=3407"/>
		<updated>2017-11-08T07:59:08Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Full list */&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 &amp;gt;=4.6 series 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;
** SDL2&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;
** &#039;&#039;curl&#039;&#039;&lt;br /&gt;
* Optional (for AI Interfaces, Skirmish AIs and unit tests)&lt;br /&gt;
** &#039;&#039;python&#039;&#039; (2.5+)&lt;br /&gt;
** &#039;&#039;jdk&#039;&#039; (1.5+)&lt;br /&gt;
** &#039;&#039;boost&#039;&#039; (version 1.47 or later)&lt;br /&gt;
*** &#039;&#039;chrono&#039;&#039;&lt;br /&gt;
*** &#039;&#039;filesystem&#039;&#039;&lt;br /&gt;
*** &#039;&#039;threads&#039;&#039;&lt;br /&gt;
*** &#039;&#039;system&#039;&#039;&lt;br /&gt;
*** &#039;&#039;chrono&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
&lt;br /&gt;
For Jessie (debian 8.0 stable) this should work:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install build-essential zlib1g-dev libfreetype6-dev cmake \&lt;br /&gt;
libsdl2-dev libopenal-dev libglew-dev zip libvorbis-dev libxcursor-dev \&lt;br /&gt;
libdevil-dev libboost-system1.55-dev libboost-thread1.55-dev \&lt;br /&gt;
libboost-regex1.55-dev libboost-serialization1.55-dev \&lt;br /&gt;
libboost-program-options1.55-dev libboost-chrono1.55-dev \&lt;br /&gt;
libunwind-dev  libboost-filesystem1.55-dev \&lt;br /&gt;
libboost-signals1.55-dev libboost-test1.55-dev \&lt;br /&gt;
xsltproc libfontconfig1-dev libcurl4-openssl-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&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 libsdl2-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;
 libboost-chrono-dev libboost-filesystem-dev libunwind8-dev \&lt;br /&gt;
 default-jdk libcurl4-gnutls-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to speed up compiling/linking, you can install gold, an alternative linker and when you plan to develop / recompile often 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-2&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;
Or better you install Spring via [http://springrts.com/wiki/Gentoo_install layman], it will install all dependencies.&lt;br /&gt;
&lt;br /&gt;
== Fedora ==&lt;br /&gt;
&lt;br /&gt;
On Fedora 12-21:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install gcc-c++ cmake boost-devel DevIL-devel freetype-devel libunwind-devel \&lt;br /&gt;
glew-devel libvorbis-devel libXcursor-devel openal-devel SDL2-devel p7zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&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 SDL2-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;
== Slackware ==&lt;br /&gt;
&lt;br /&gt;
On Slackware 13, cmake, ogg &amp;amp; vorbis, boost, glew and SDL2 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;
Try to use [http://idlemoor.github.io/slackrepo/ slackrepo], will search, update and install spring and dependences.&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;
&lt;br /&gt;
For other targets see the output of &amp;lt;code&amp;gt;make help&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= See Also: =&lt;br /&gt;
* [[Finalizing_linux_install]]&lt;br /&gt;
* [[Troubleshooting_linux]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download_Testing&amp;diff=6192</id>
		<title>Download Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download_Testing&amp;diff=6192"/>
		<updated>2017-09-06T09:33:36Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spring Engine Testing Release  =&lt;br /&gt;
&lt;br /&gt;
Current test version: {{EngineVersion:Testing}} ({{EngineVersion:Testing:ReleaseDate}})&lt;br /&gt;
&lt;br /&gt;
== Get It ==&lt;br /&gt;
&lt;br /&gt;
=== [[SpringLobby]] ===&lt;br /&gt;
&lt;br /&gt;
Go to Tools-&amp;gt;Download Archives, then enter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
engine:spring {{EngineVersion:Testing}} {{EngineBranch:Testing}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Click ok.&lt;br /&gt;
&lt;br /&gt;
=== [[pr-downloader]] ===&lt;br /&gt;
easiest way is by using pr-downloader (which is included into spring)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
pr-downloader --download-engine &amp;quot;{{EngineVersion:Testing}} {{EngineBranch:Testing}}&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Distributions-windows.png]]&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/win32/spring_&amp;amp;#123;{{EngineBranch:Testing}}&amp;amp;#125;{{EngineVersion:Testing}}_win32.exe installer]&lt;br /&gt;
&amp;lt;li&amp;gt; [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/win32/spring_&amp;amp;#123;{{EngineBranch:Testing}}&amp;amp;#125;{{EngineVersion:Testing}}_win32-minimal-portable.7z portable] (Lobby not included)&lt;br /&gt;
&amp;lt;li&amp;gt; [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/win32/ whole build]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Tux-G2.png]]&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;&#039;get the source&#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; creating the repo (first time only):&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;git clone git://github.com/spring/spring.git spring_src&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; update to latest sources:&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;cd spring_src &amp;amp;&amp;amp; git fetch &amp;amp;&amp;amp; git checkout {{EngineVersion:Testing}}&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;&#039;build&#039;&#039;&#039; by following the [[Building_Spring_on_Linux|build from source]] guide, or in short:&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;code&amp;gt;cmake -G &amp;quot;Unix Makefiles&amp;quot; . &amp;amp;&amp;amp; make spring &amp;amp;&amp;amp; sudo make install-spring&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===static builds===&lt;br /&gt;
as alternative you can try the one of the linux static builds:&lt;br /&gt;
&lt;br /&gt;
* [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/linux32/spring_%7b{{EngineBranch:Testing}}%7d{{EngineVersion:Testing}}_minimal-portable-linux32-static.7z static linux build (32 bit)]&lt;br /&gt;
&lt;br /&gt;
* [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/linux64/spring_%7b{{EngineBranch:Testing}}%7d{{EngineVersion:Testing}}_minimal-portable-linux64-static.7z static linux build (64 bit)]&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Distributions-mac-2.png]]&lt;br /&gt;
|&lt;br /&gt;
[https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/osx64/spring_%7b{{EngineBranch:Testing}}%7d{{EngineVersion:Testing}}_MacOSX-10.6-SnowLeopard.zip &#039;&#039;&#039;App Bundle&#039;&#039;&#039;] (tested on 10.6 Snow-Leopard only)&lt;br /&gt;
&lt;br /&gt;
In case the above fails, check out [[Spring_on_MacOSX|alternative ways]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Lobby ==&lt;br /&gt;
&lt;br /&gt;
Make sure your lobby client is configured to use the correct spring binary &amp;amp; unitsync!&lt;br /&gt;
On Linux, this will usually be &#039;&#039;/usr/local/bin/spring&#039;&#039; &amp;amp; &#039;&#039;/usr/local/lib/libunitsync.so&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Use one of the test lobby servers (recommended):&lt;br /&gt;
* &#039;&#039;lobby1.springlobby.info:8200&#039;&#039;&lt;br /&gt;
* &#039;&#039;lobby2.springlobby.info:8200&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Or alternatively, configure your lobby so it does not insist using the release version of the engine:&lt;br /&gt;
* SpringLobby: set &amp;lt;code&amp;gt;DisableVersionCheck=1&amp;lt;/code&amp;gt; in &#039;&#039;springlobby.conf&#039;&#039;&lt;br /&gt;
* TASClient: press CTRL+SHIFT+F6 and enable &amp;quot;Ignore server version incompatibility&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Bugs and issues ==&lt;br /&gt;
&lt;br /&gt;
Report on [https://springrts.com/mantis/ Mantis].&lt;br /&gt;
Remember to upload [[infolog.txt]] if you crash!&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
&lt;br /&gt;
For changes please look into the [https://github.com/spring/spring/blob/{{EngineVersion:Testing}}/doc/changelog.txt Change Log] or the [https://github.com/spring/spring/compare/{{EngineVersion:Stable}}...{{EngineVersion:Testing}} diff log] for details.&lt;br /&gt;
&lt;br /&gt;
See the topmost for changes to the upcoming version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Development]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download_Testing&amp;diff=6191</id>
		<title>Download Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download_Testing&amp;diff=6191"/>
		<updated>2017-09-06T09:33:15Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Spring Engine Testing Release  =&lt;br /&gt;
&lt;br /&gt;
Current test version: {{EngineVersion:Testing}} ({{EngineVersion:Testing:ReleaseDate}})&lt;br /&gt;
&lt;br /&gt;
== Get It ==&lt;br /&gt;
&lt;br /&gt;
=== [[SpringLobby]] ===&lt;br /&gt;
&lt;br /&gt;
Go to Tools-&amp;gt;Download Archives, then enter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
engine:spring {{EngineVersion:Testing}} {{EngineBranch:Testing}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Click ok.&lt;br /&gt;
&lt;br /&gt;
=== [[pr-downloader]] ===&lt;br /&gt;
easiest way is by using pr-downloader (which is included into spring)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
pr-downloader --download-engine &amp;quot;{{EngineVersion:Testing}} {{EngineBranch:Testing}}&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Distributions-windows.png]]&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/win32/spring_&amp;amp;#123;{{EngineBranch:Testing}}&amp;amp;#125;{{EngineVersion:Testing}}_win32.exe installer]&lt;br /&gt;
&amp;lt;li&amp;gt; [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/win32/spring_&amp;amp;#123;{{EngineBranch:Testing}}&amp;amp;#125;{{EngineVersion:Testing}}_win32-minimal-portable.7z portable] (Lobby not included)&lt;br /&gt;
&amp;lt;li&amp;gt; [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/win32/ whole build]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Tux-G2.pngâ€Ž]]&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;&#039;get the source&#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; creating the repo (first time only):&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;git clone git://github.com/spring/spring.git spring_src&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; update to latest sources:&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;cd spring_src &amp;amp;&amp;amp; git fetch &amp;amp;&amp;amp; git checkout {{EngineVersion:Testing}}&amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; &#039;&#039;&#039;build&#039;&#039;&#039; by following the [[Building_Spring_on_Linux|build from source]] guide, or in short:&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;code&amp;gt;cmake -G &amp;quot;Unix Makefiles&amp;quot; . &amp;amp;&amp;amp; make spring &amp;amp;&amp;amp; sudo make install-spring&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===static builds===&lt;br /&gt;
as alternative you can try the one of the linux static builds:&lt;br /&gt;
&lt;br /&gt;
* [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/linux32/spring_%7b{{EngineBranch:Testing}}%7d{{EngineVersion:Testing}}_minimal-portable-linux32-static.7z static linux build (32 bit)]&lt;br /&gt;
&lt;br /&gt;
* [https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/linux64/spring_%7b{{EngineBranch:Testing}}%7d{{EngineVersion:Testing}}_minimal-portable-linux64-static.7z static linux build (64 bit)]&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Distributions-mac-2.png]]&lt;br /&gt;
|&lt;br /&gt;
[https://springrts.com/dl/buildbot/default/{{EngineBranch:Testing}}/{{EngineVersion:Testing}}/osx64/spring_%7b{{EngineBranch:Testing}}%7d{{EngineVersion:Testing}}_MacOSX-10.6-SnowLeopard.zip &#039;&#039;&#039;App Bundle&#039;&#039;&#039;] (tested on 10.6 Snow-Leopard only)&lt;br /&gt;
&lt;br /&gt;
In case the above fails, check out [[Spring_on_MacOSX|alternative ways]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Lobby ==&lt;br /&gt;
&lt;br /&gt;
Make sure your lobby client is configured to use the correct spring binary &amp;amp; unitsync!&lt;br /&gt;
On Linux, this will usually be &#039;&#039;/usr/local/bin/spring&#039;&#039; &amp;amp; &#039;&#039;/usr/local/lib/libunitsync.so&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Use one of the test lobby servers (recommended):&lt;br /&gt;
* &#039;&#039;lobby1.springlobby.info:8200&#039;&#039;&lt;br /&gt;
* &#039;&#039;lobby2.springlobby.info:8200&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Or alternatively, configure your lobby so it does not insist using the release version of the engine:&lt;br /&gt;
* SpringLobby: set &amp;lt;code&amp;gt;DisableVersionCheck=1&amp;lt;/code&amp;gt; in &#039;&#039;springlobby.conf&#039;&#039;&lt;br /&gt;
* TASClient: press CTRL+SHIFT+F6 and enable &amp;quot;Ignore server version incompatibility&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Bugs and issues ==&lt;br /&gt;
&lt;br /&gt;
Report on [https://springrts.com/mantis/ Mantis].&lt;br /&gt;
Remember to upload [[infolog.txt]] if you crash!&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
&lt;br /&gt;
For changes please look into the [https://github.com/spring/spring/blob/{{EngineVersion:Testing}}/doc/changelog.txt Change Log] or the [https://github.com/spring/spring/compare/{{EngineVersion:Stable}}...{{EngineVersion:Testing}} diff log] for details.&lt;br /&gt;
&lt;br /&gt;
See the topmost for changes to the upcoming version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Development]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22649</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22649"/>
		<updated>2017-09-02T13:35:24Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;02. September 2017&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22598</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22598"/>
		<updated>2017-09-02T13:33:29Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;103.0.1-1328-g882485f&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22648</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22648"/>
		<updated>2017-09-02T13:32:26Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;01. September 2017&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22647</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22647"/>
		<updated>2017-08-01T14:39:16Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;01. August 2017&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22597</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22597"/>
		<updated>2017-08-01T14:39:05Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;103.0.1-1244-g70d14a0&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22596</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22596"/>
		<updated>2017-07-17T20:01:51Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;103.0.1-1222-g37dc534&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22646</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22646"/>
		<updated>2017-07-17T20:01:33Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;17. July 2017&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Licenses_Forking_Mutators&amp;diff=10352</id>
		<title>Licenses Forking Mutators</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Licenses_Forking_Mutators&amp;diff=10352"/>
		<updated>2016-12-07T00:44:05Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* FAQ: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;span style=&amp;quot;color:#FF0000; background:#000000&amp;quot;&amp;gt; --- DRAFT --- &amp;lt;/span&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Guidelines on licensing, forks and mutators within the Spring community=&lt;br /&gt;
&lt;br /&gt;
==Licensing for content devs, in brief:==&lt;br /&gt;
&lt;br /&gt;
We think a package of content for Spring (e.g. sdz, sd7) is not a &amp;quot;single work&amp;quot; derived of the engine in the terms of the GPL. A package of content may consist of multiple independent works, each of which may be covered by a different license.&lt;br /&gt;
&lt;br /&gt;
We generally view &#039;&#039;&#039;code&#039;&#039;&#039; that is necessarily read/executed by the Spring engine, as linking to the engine. As a result, since the engine is licensed under GPL, we think that such code requires a GPL compatible license. This typically applies to widgets, gadgets, scripts, shaders, CEGs, unit defs, etc.&lt;br /&gt;
&lt;br /&gt;
All other content that you create, such as &#039;&#039;&#039;artwork&#039;&#039;&#039;, can be licensed however you wish. That said, we encourage you to use open source copyleft licenses, and make your content free for anyone to use and modify.&lt;br /&gt;
&lt;br /&gt;
Details can be found in https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=17847. Please remember that on our forums we require that discussion of specific projects licensing is &amp;quot;in very good faith and a highly positive and productive manner&amp;quot; ;)&lt;br /&gt;
&lt;br /&gt;
==Forks and mutators:==&lt;br /&gt;
&lt;br /&gt;
As a general rule, Spring encourages content sharing whilst also discouraging unwanted imitation of existing content.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;mutator&#039;&#039;&#039; (of map or mod type) built on game X should make it explicitly clear in its name that it will modify/augment content from X.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;fork&#039;&#039;&#039; of game X should have a clearly distinct name and versioning scheme, and a clearly visible difference to the content of the most recent release of X.&lt;br /&gt;
&lt;br /&gt;
In both cases:&lt;br /&gt;
* The license(s) of game X should be respected;&lt;br /&gt;
* Names, version numbers and other branding should not attempt to imitate the original game X;&lt;br /&gt;
* Promotion (including promotion by players) should not take place within the infrastructure of game X;&lt;br /&gt;
* A non-technical description of the changes/mutations made from (a named version of) game X should be made publicly available on Springs forums - in a release post, change-log, or similar; &lt;br /&gt;
&lt;br /&gt;
Exceptions to these conditions may occur only if the developers of game X have given permission for them.&lt;br /&gt;
&lt;br /&gt;
When these conditions are satisfied, mutators and forks of existing games may be used on Springs server. Where possible, the mutator/fork can initialize data (ingame times, TrueSkill scores, etc) within Springs infrastructure from a copy of similar data that Spring already holds related to game X.&lt;br /&gt;
&lt;br /&gt;
In practice, within Spring:&lt;br /&gt;
* If you develop a game and feel that a mutator/fork of your project is not following these guidelines, contact Springs moderators.&lt;br /&gt;
* If you want to fork/mutate a game, we encourage you to contact its developers first.&lt;br /&gt;
&lt;br /&gt;
=FAQ:=&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What about &#039;&#039;&#039;procedurally generated art&#039;&#039;&#039;, or artwork such as a story-line that happens to be stored within a lua file?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) This is a grey area, and in some cases there may not be a clear answer. A lua gadget that generates art is code and should be GPL compatible, but a file containing a lua table with one sentence of a story on each line could reasonably be viewed as artwork.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to make a &#039;&#039;&#039;commercial game&#039;&#039;&#039;. How can I protect my rights to license it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) You may use a restrictive license for your artwork, although we&#039;d prefer that you didn&#039;t! At the very least, if you stop making/selling your game we hope that you would re-license all your content freely.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to develop/distribute a &#039;&#039;&#039;game agnostic utility or library&#039;&#039;&#039;, with game X included as an example, but I need to make modifications to X for this. Can I?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes. As long as you respect the license of X and stick to modifying the technical stuff needed for your own work, we won&#039;t consider it to be affected by these guidelines.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I store some &#039;&#039;&#039;data related to game X&#039;&#039;&#039; on my own servers, do I have to share this data to a fork of game X?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) No, it&#039;s your data. But if you&#039;d like your data/project to be viewed as &amp;quot;within Spring&#039;s infrastructure&amp;quot; for the purposes of these guidelines, then let us know.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to make a fork or mutator of X but the maintainers of X refuse to endorse it. Can I still do it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes, as long as the guidelines above are followed by both yourself and your players.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;Should I make &#039;&#039;&#039;a fork or a mutator&#039;&#039;&#039;?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) In general, mutators should be used by projects that, as part of their own development, usually incorporate changes found in new releases of their parent game - such as an added-on &amp;quot;King of the Hill&amp;quot; or &amp;quot;Tower Defence&amp;quot; mode. Forks should be used by projects that tend not to incorporate innovations found in new releases of their parent game.&lt;br /&gt;
&lt;br /&gt;
(Q) What is a &amp;quot;clearly visible difference to the content of the most recent release of X&amp;quot;? &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) A difference that, if it was present in a typical game of the most recent release of X, would be noticed and reacted to by most (and ideally, all) of the players.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want my game to share infrastructure from another game (hosts, content distribution, forum, etc). Can it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Not unless the developers of the other game want it to.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I am a developer, can I impose additional conditions on how people use my content within Spring?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes, as long as they don&#039;t conflict with the guidelines above. We would prefer you to do it via your license.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What will happen if I, or other users of my content, break these guidelines?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Typically, we may withhold use of Spring&#039;s infrastructure (such as the forum, lobby server, rapid, SpringFiles, botflags, etc) and may remove offending content. In serious cases we may issue warnings and bans.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What about games containing OTA content? What about different points of view of GPL, packages and linking?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) See https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=17847 and https://springrts.com/wiki/Felony#11.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;Who takes decisions to cover &#039;&#039;&#039;grey areas and disputes&#039;&#039;&#039;? Who updates/modifies these guidelines?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Spring&#039;s moderators and administrators. Note that these are our community guidelines; this is NOT a legal document.&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Licenses_Forking_Mutators&amp;diff=10351</id>
		<title>Licenses Forking Mutators</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Licenses_Forking_Mutators&amp;diff=10351"/>
		<updated>2016-12-07T00:40:49Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* FAQ: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;span style=&amp;quot;color:#FF0000; background:#000000&amp;quot;&amp;gt; --- DRAFT --- &amp;lt;/span&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Guidelines on licensing, forks and mutators within the Spring community=&lt;br /&gt;
&lt;br /&gt;
==Licensing for content devs, in brief:==&lt;br /&gt;
&lt;br /&gt;
We think a package of content for Spring (e.g. sdz, sd7) is not a &amp;quot;single work&amp;quot; derived of the engine in the terms of the GPL. A package of content may consist of multiple independent works, each of which may be covered by a different license.&lt;br /&gt;
&lt;br /&gt;
We generally view &#039;&#039;&#039;code&#039;&#039;&#039; that is necessarily read/executed by the Spring engine, as linking to the engine. As a result, since the engine is licensed under GPL, we think that such code requires a GPL compatible license. This typically applies to widgets, gadgets, scripts, shaders, CEGs, unit defs, etc.&lt;br /&gt;
&lt;br /&gt;
All other content that you create, such as &#039;&#039;&#039;artwork&#039;&#039;&#039;, can be licensed however you wish. That said, we encourage you to use open source copyleft licenses, and make your content free for anyone to use and modify.&lt;br /&gt;
&lt;br /&gt;
Details can be found in https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=17847. Please remember that on our forums we require that discussion of specific projects licensing is &amp;quot;in very good faith and a highly positive and productive manner&amp;quot; ;)&lt;br /&gt;
&lt;br /&gt;
==Forks and mutators:==&lt;br /&gt;
&lt;br /&gt;
As a general rule, Spring encourages content sharing whilst also discouraging unwanted imitation of existing content.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;mutator&#039;&#039;&#039; (of map or mod type) built on game X should make it explicitly clear in its name that it will modify/augment content from X.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;fork&#039;&#039;&#039; of game X should have a clearly distinct name and versioning scheme, and a clearly visible difference to the content of the most recent release of X.&lt;br /&gt;
&lt;br /&gt;
In both cases:&lt;br /&gt;
* The license(s) of game X should be respected;&lt;br /&gt;
* Names, version numbers and other branding should not attempt to imitate the original game X;&lt;br /&gt;
* Promotion (including promotion by players) should not take place within the infrastructure of game X;&lt;br /&gt;
* A non-technical description of the changes/mutations made from (a named version of) game X should be made publicly available on Springs forums - in a release post, change-log, or similar; &lt;br /&gt;
&lt;br /&gt;
Exceptions to these conditions may occur only if the developers of game X have given permission for them.&lt;br /&gt;
&lt;br /&gt;
When these conditions are satisfied, mutators and forks of existing games may be used on Springs server. Where possible, the mutator/fork can initialize data (ingame times, TrueSkill scores, etc) within Springs infrastructure from a copy of similar data that Spring already holds related to game X.&lt;br /&gt;
&lt;br /&gt;
In practice, within Spring:&lt;br /&gt;
* If you develop a game and feel that a mutator/fork of your project is not following these guidelines, contact Springs moderators.&lt;br /&gt;
* If you want to fork/mutate a game, we encourage you to contact its developers first.&lt;br /&gt;
&lt;br /&gt;
=FAQ:=&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What about &#039;&#039;&#039;procedurally generated art&#039;&#039;&#039;, or artwork such as a story-line that happens to be stored within a lua file?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) This is a grey area, and in some cases there may not be a clear answer. A lua gadget that generates art is code and should be GPL compatible, but a file containing a lua table with one sentence of a story on each line could reasonably be viewed as artwork.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to make a &#039;&#039;&#039;commercial game&#039;&#039;&#039;. How can I protect my rights to license it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) You may use a restrictive license for your artwork, although we&#039;d prefer that you didn&#039;t! At the very least, if you stop making/selling your game we hope that you would re-license all your content freely.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to develop/distribute a &#039;&#039;&#039;game agnostic utility or library&#039;&#039;&#039;, with game X included as an example, but I need to make modifications to X for this. Can I?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes. As long as you respect the license of X and stick to modifying the technical stuff needed for your own work, we won&#039;t consider it to be affected by these guidelines.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I store some &#039;&#039;&#039;data related to game X&#039;&#039;&#039; on my own servers, do I have to share this data to a fork of game X?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) No, it&#039;s your data. But if you&#039;d like your data/project to be viewed as &amp;quot;within Spring&#039;s infrastructure&amp;quot; for the purposes of these guidelines, then let us know.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to make a fork or mutator of X but the maintainers of X refuse to endorse it. Can I still do it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes, as long as the guidelines above are followed by both yourself and your players.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;Should I make &#039;&#039;&#039;a fork or a mutator&#039;&#039;&#039;?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) In general, mutators should be used by projects that, as part of their own development, usually incorporate changes found in new releases of their parent game - such as an added-on &amp;quot;King of the Hill&amp;quot; or &amp;quot;Tower Defence&amp;quot; mode. Forks should be used by projects that tend not to incorporate innovations found in new releases of their parent game.&lt;br /&gt;
&lt;br /&gt;
(Q) What is a &amp;quot;clearly visible difference to the content of the most recent release of X&amp;quot;? &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) A difference that, if it was present in a typical game of the most recent release of X, would be noticed and reacted to by most (and ideally, all) of the players.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want my game to share infrastructure from another game (hosts, content distribution, forum, etc). Can it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Not unless the developers of the other game want it to.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I am a developer, can I impose additional conditions on how people use my content within Spring?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes, as long as they don&#039;t conflict with the guidelines above. We would prefer you to do it via your license.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What will happen if I, or other users of my content, break these guidelines?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Typically, we may withhold use of Spring&#039;s infrastructure (such as the forum, lobby server, rapid, SpringFiles, botflags, etc) and may remove offending content. In serious cases we may issue warnings and bans.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What about games containing OTA content? What about different points of view of GPL, packages and linking?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) See https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=17847 and https://springrts.com/wiki/Felony#11.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;Who takes decisions to cover &#039;&#039;&#039;grey areas and disputes&#039;&#039;&#039;? Who updates/modifies these guidelines?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Springs moderators and administrators. Note that these are our community guidelines; this is NOT a legal document.&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Licenses_Forking_Mutators&amp;diff=10350</id>
		<title>Licenses Forking Mutators</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Licenses_Forking_Mutators&amp;diff=10350"/>
		<updated>2016-12-07T00:40:15Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* FAQ: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;span style=&amp;quot;color:#FF0000; background:#000000&amp;quot;&amp;gt; --- DRAFT --- &amp;lt;/span&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Guidelines on licensing, forks and mutators within the Spring community=&lt;br /&gt;
&lt;br /&gt;
==Licensing for content devs, in brief:==&lt;br /&gt;
&lt;br /&gt;
We think a package of content for Spring (e.g. sdz, sd7) is not a &amp;quot;single work&amp;quot; derived of the engine in the terms of the GPL. A package of content may consist of multiple independent works, each of which may be covered by a different license.&lt;br /&gt;
&lt;br /&gt;
We generally view &#039;&#039;&#039;code&#039;&#039;&#039; that is necessarily read/executed by the Spring engine, as linking to the engine. As a result, since the engine is licensed under GPL, we think that such code requires a GPL compatible license. This typically applies to widgets, gadgets, scripts, shaders, CEGs, unit defs, etc.&lt;br /&gt;
&lt;br /&gt;
All other content that you create, such as &#039;&#039;&#039;artwork&#039;&#039;&#039;, can be licensed however you wish. That said, we encourage you to use open source copyleft licenses, and make your content free for anyone to use and modify.&lt;br /&gt;
&lt;br /&gt;
Details can be found in https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=17847. Please remember that on our forums we require that discussion of specific projects licensing is &amp;quot;in very good faith and a highly positive and productive manner&amp;quot; ;)&lt;br /&gt;
&lt;br /&gt;
==Forks and mutators:==&lt;br /&gt;
&lt;br /&gt;
As a general rule, Spring encourages content sharing whilst also discouraging unwanted imitation of existing content.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;mutator&#039;&#039;&#039; (of map or mod type) built on game X should make it explicitly clear in its name that it will modify/augment content from X.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;fork&#039;&#039;&#039; of game X should have a clearly distinct name and versioning scheme, and a clearly visible difference to the content of the most recent release of X.&lt;br /&gt;
&lt;br /&gt;
In both cases:&lt;br /&gt;
* The license(s) of game X should be respected;&lt;br /&gt;
* Names, version numbers and other branding should not attempt to imitate the original game X;&lt;br /&gt;
* Promotion (including promotion by players) should not take place within the infrastructure of game X;&lt;br /&gt;
* A non-technical description of the changes/mutations made from (a named version of) game X should be made publicly available on Springs forums - in a release post, change-log, or similar; &lt;br /&gt;
&lt;br /&gt;
Exceptions to these conditions may occur only if the developers of game X have given permission for them.&lt;br /&gt;
&lt;br /&gt;
When these conditions are satisfied, mutators and forks of existing games may be used on Springs server. Where possible, the mutator/fork can initialize data (ingame times, TrueSkill scores, etc) within Springs infrastructure from a copy of similar data that Spring already holds related to game X.&lt;br /&gt;
&lt;br /&gt;
In practice, within Spring:&lt;br /&gt;
* If you develop a game and feel that a mutator/fork of your project is not following these guidelines, contact Springs moderators.&lt;br /&gt;
* If you want to fork/mutate a game, we encourage you to contact its developers first.&lt;br /&gt;
&lt;br /&gt;
=FAQ:=&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What about &#039;&#039;&#039;procedurally generated art&#039;&#039;&#039;, or artwork such as a story-line that happens to be stored within a lua file?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) This is a grey area, and in some cases there may not be a clear answer. A lua gadget that generates art is code and should be GPL compatible, but a file containing a lua table with one sentence of a story on each line could reasonably be viewed as artwork.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to make a &#039;&#039;&#039;commercial game&#039;&#039;&#039;. How can I protect my rights to license it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) You may use a restrictive license for your artwork, although we&#039;d prefer that you didn&#039;t! At the very least, if you stop making/selling your game we hope that you would re-license all your content freely.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to develop/distribute a &#039;&#039;&#039;game agnostic utility or library&#039;&#039;&#039;, with game X included as an example, but I need to make modifications to X for this. Can I?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes. As long as you respect the license of X and stick to modifying the technical stuff needed for your own work, we won&#039;t consider it to be affected by these guidelines.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I store some &#039;&#039;&#039;data related to game X&#039;&#039;&#039; on my own servers, do I have to share this data to a fork of game X?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) No, it&#039;s your data. But if you&#039;d like your data/project to be viewed as &amp;quot;within Springs infrastructure&amp;quot;, for the purposes of these guidelines, then let us know.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want to make a fork or mutator of X but the maintainers of X refuse to endorse it. Can I still do it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes, as long as the guidelines above are followed by both yourself and your players.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;Should I make &#039;&#039;&#039;a fork or a mutator&#039;&#039;&#039;?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) In general, mutators should be used by projects that, as part of their own development, usually incorporate changes found in new releases of their parent game - such as an added-on &amp;quot;King of the Hill&amp;quot; or &amp;quot;Tower Defence&amp;quot; mode. Forks should be used by projects that tend not to incorporate innovations found in new releases of their parent game.&lt;br /&gt;
&lt;br /&gt;
(Q) What is a &amp;quot;clearly visible difference to the content of the most recent release of X&amp;quot;? &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) A difference that, if it was present in a typical game of the most recent release of X, would be noticed and reacted to by most (and ideally, all) of the players.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I want my game to share infrastructure from another game (hosts, content distribution, forum, etc). Can it?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Not unless the developers of the other game want it to.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;I am a developer, can I impose additional conditions on how people use my content within Spring?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Yes, as long as they don&#039;t conflict with the guidelines above. We would prefer you to do it via your license.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What will happen if I, or other users of my content, break these guidelines?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Typically, we may withhold use of Spring&#039;s infrastructure (such as the forum, lobby server, rapid, SpringFiles, botflags, etc) and may remove offending content. In serious cases we may issue warnings and bans.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;What about games containing OTA content? What about different points of view of GPL, packages and linking?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) See https://springrts.com/phpbb/viewtopic.php?f=1&amp;amp;t=17847 and https://springrts.com/wiki/Felony#11.&lt;br /&gt;
&lt;br /&gt;
(Q) &amp;quot;Who takes decisions to cover &#039;&#039;&#039;grey areas and disputes&#039;&#039;&#039;? Who updates/modifies these guidelines?&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
(A) Springs moderators and administrators. Note that these are our community guidelines; this is NOT a legal document.&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Comparison&amp;diff=10559</id>
		<title>Lobby Comparison</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Comparison&amp;diff=10559"/>
		<updated>2016-07-10T08:29:33Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: Undo revision 30137 by Hokomoko (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WARNING: this is WIP and not correct for now!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(features which every lobby has aren&#039;t listed)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| unique Features&lt;br /&gt;
| [[SpringLobby]]&lt;br /&gt;
| [[Lobby_Development#Zero-K_Lobby|Zero-K Lobby]]&lt;br /&gt;
| [[Lobby_Development#Weblobby|Weblobby]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Uberserver|official spring lobby server]]&lt;br /&gt;
| âœ”&lt;br /&gt;
|&lt;br /&gt;
| âœ” &lt;br /&gt;
|-&lt;br /&gt;
| Zero-K lobby server&lt;br /&gt;
|&lt;br /&gt;
| âœ” &lt;br /&gt;
| âœ” &lt;br /&gt;
|-&lt;br /&gt;
| relayhost&lt;br /&gt;
| âœ” &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| singleplayer (vs ai, offline)&lt;br /&gt;
| âœ” &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| offline watch replays&lt;br /&gt;
| âœ” &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| missions (online)&lt;br /&gt;
|&lt;br /&gt;
| âœ” &lt;br /&gt;
| âœ” &lt;br /&gt;
|-&lt;br /&gt;
| host game&lt;br /&gt;
| âœ”&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Features which all lobbies have:&lt;br /&gt;
&lt;br /&gt;
* automatic download of map/game/engine&lt;br /&gt;
* online multiplayer&lt;br /&gt;
* online singleplayer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Lobby]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Comparison&amp;diff=10558</id>
		<title>Lobby Comparison</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Comparison&amp;diff=10558"/>
		<updated>2016-07-10T07:51:00Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WARNING: this is WIP and not correct for now!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(features which every lobby has aren&#039;t listed)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| unique Features&lt;br /&gt;
| [[SpringLobby]]&lt;br /&gt;
| [[Lobby_Development#Zero-K_Lobby|Zero-K Lobby]]&lt;br /&gt;
| [[Lobby_Development#Weblobby|Weblobby]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Uberserver|official spring lobby server]]&lt;br /&gt;
| âœ”&lt;br /&gt;
|&lt;br /&gt;
| âœ” &lt;br /&gt;
|-&lt;br /&gt;
| Zero-K lobby server&lt;br /&gt;
|&lt;br /&gt;
| âœ” &lt;br /&gt;
| âœ” &lt;br /&gt;
|-&lt;br /&gt;
| relayhost&lt;br /&gt;
| âœ” &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| singleplayer (vs ai, offline)&lt;br /&gt;
| âœ” &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| offline watch replays&lt;br /&gt;
| âœ” &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| missions (online)&lt;br /&gt;
|&lt;br /&gt;
| âœ” &lt;br /&gt;
| âœ” &lt;br /&gt;
|-&lt;br /&gt;
| host game&lt;br /&gt;
| âœ”&lt;br /&gt;
| âœ”&lt;br /&gt;
| âœ”&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Features which all lobbies have:&lt;br /&gt;
&lt;br /&gt;
* automatic download of map/game/engine&lt;br /&gt;
* online multiplayer&lt;br /&gt;
* online singleplayer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Lobby]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-CobConstants&amp;diff=1938</id>
		<title>Animation-CobConstants</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-CobConstants&amp;diff=1938"/>
		<updated>2016-05-31T11:40:23Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Custom Variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Source==&lt;br /&gt;
&lt;br /&gt;
This has a list of all COB SET/GET constants: {{sourcelink|file=rts/Sim/Units/Scripts/CobDefines.h}}&lt;br /&gt;
&lt;br /&gt;
You&#039;ll want to include a file with these constants in your script.&lt;br /&gt;
&lt;br /&gt;
==SET/GET==&lt;br /&gt;
&lt;br /&gt;
===Use===&lt;br /&gt;
Use GET [tag] to get a value. Some GETs refer to functions; in this case, use GET [tag](arg1, arg2, arg3, arg4).&lt;br /&gt;
Use SET [tag] to [value] to change a value.&lt;br /&gt;
&lt;br /&gt;
===Tags===&lt;br /&gt;
There&#039;s a lot of GET/SET tags; I&#039;ll cover some of the more useful but less intuitive ones.&lt;br /&gt;
&lt;br /&gt;
*ACTIVATION: Whether the unit is on (true) or off (false).&lt;br /&gt;
*ARMORED: When true, any damage dealt to the unit will be multiplied by its damageModifier.&lt;br /&gt;
*PRINT: You can use GET PRINT to send up to 4 arguments to chat. Useful for debugging. Example: 	&#039;&#039;&#039;get PRINT(1, 5,9,10);&#039;&#039;&#039; statement will print the following into infolog: &#039;&#039;&#039;Value 1: 1, 2: 5, 3: 9, 4: 10&#039;&#039;&#039;&lt;br /&gt;
*VETERAN_LEVEL: The unit&#039;s experience times 100. Note that you can SET this via script, although the unit won&#039;t gain any extra health from doing so.&lt;br /&gt;
&lt;br /&gt;
=== Custom Variables ===&lt;br /&gt;
{{removed|101.0}}&lt;br /&gt;
&lt;br /&gt;
Higher GET/SET numbers are reserved for custom variables. These are very useful for Lua integration. Setting these variables is much (perhaps 100x) faster than calling functions across Lua and COB; the disadvantages are the limited number of variables and the fact that the other side is not immediately notified of a change in the variable.&lt;br /&gt;
&lt;br /&gt;
*Unit variables: The 8 numbers starting at 1024 correspond to per-unit variables. To get at these from Lua, use Spring.[Get|Set]COBUnitVar.&lt;br /&gt;
*Team variables: The 64 numbers starting at 2048 correspond to per-team variables. To get at these from Lua, use Spring.[Get|Set]COBTeamVar.&lt;br /&gt;
*Ally variables: The 64 numbers starting at 3072 correspond to per-team variables. To get at these from Lua, use Spring.[Get|Set]COBAllyTeamVar.&lt;br /&gt;
*Global variables: The 4096 numbers starting at 4096 correspond to global variables. To get at these from Lua, use Spring.[Get|Set]COBGlobalVar.&lt;br /&gt;
&lt;br /&gt;
==emit-sfx==&lt;br /&gt;
&lt;br /&gt;
 emit-sfx [sfxtype] from [piece];&lt;br /&gt;
&lt;br /&gt;
The least significant byte of sfxtype is treated as an unsigned integer; the remaining bits are a bitmask. The bitmask indicates what &#039;&#039;type&#039;&#039; of sfx to emit, while the number indicates &#039;&#039;which&#039;&#039; sfx of that type to emit. The bits are as follows:&lt;br /&gt;
&lt;br /&gt;
*256: Point-based fx. Used for white smoke (1), black smoke (2), and bubbles (3).&lt;br /&gt;
*1024: Unit sfx. Use with the unit&#039;s sfxtypes.explosionGenerators. The first one is 0, the second one is 1, etc.&lt;br /&gt;
*2048: Fire weapon. Fires a weapon from the piece (no aiming involved). Again, the first weapon is 0, the second weapon is 1, etc.&lt;br /&gt;
*4096: Explode weapon. Detonates a weapon at the piece. Again, the first weapon is 0, the second weapon is 1, etc.&lt;br /&gt;
&lt;br /&gt;
If the piece has no geometry, then the sfx is emitted in the +z direction from the origin of the piece.&lt;br /&gt;
&lt;br /&gt;
If the piece has 1 vertex, the emit dir is the vector from the origin to the the position of the first vertex the emit position is the origin of the piece.&lt;br /&gt;
&lt;br /&gt;
If there is more than one vertex in the piece, then the emit vector is the vector pointing from v[0] to v[1], and the emit position is v[0].&lt;br /&gt;
&lt;br /&gt;
==explode==&lt;br /&gt;
&lt;br /&gt;
Causes the piece to explode and possibly go flying. This actually gives the appearance of making a copy of the piece (henceforth referred to as &amp;quot;debris&amp;quot;) so if you&#039;re using it outside of Killed() you may want to hide the piece in question.&lt;br /&gt;
&lt;br /&gt;
 explode [piece] type [exptype];&lt;br /&gt;
&lt;br /&gt;
exptype is a bitmask. The bits are as follows:&lt;br /&gt;
&lt;br /&gt;
*SHATTER: Explodes the debris into tiny triangles. Looks like confetti.&lt;br /&gt;
*EXPLODE_ON_HIT: Debris will explode on impact, causing about 40 damage.&lt;br /&gt;
*FALL: Debris is affected by gravity.&lt;br /&gt;
*SMOKE&lt;br /&gt;
*FIRE&lt;br /&gt;
*BITMAPONLY: No debris, just an explosion graphic.&lt;br /&gt;
*NOCEGTRAIL&lt;br /&gt;
*NOHEATCLOUD: No explosion before the piece flies off.&lt;br /&gt;
*BITMAP[1...5]: Not used in Spring, may overlap with Spring specific bits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-CobConstants&amp;diff=1937</id>
		<title>Animation-CobConstants</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-CobConstants&amp;diff=1937"/>
		<updated>2016-05-31T11:40:15Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Custom Variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Source==&lt;br /&gt;
&lt;br /&gt;
This has a list of all COB SET/GET constants: {{sourcelink|file=rts/Sim/Units/Scripts/CobDefines.h}}&lt;br /&gt;
&lt;br /&gt;
You&#039;ll want to include a file with these constants in your script.&lt;br /&gt;
&lt;br /&gt;
==SET/GET==&lt;br /&gt;
&lt;br /&gt;
===Use===&lt;br /&gt;
Use GET [tag] to get a value. Some GETs refer to functions; in this case, use GET [tag](arg1, arg2, arg3, arg4).&lt;br /&gt;
Use SET [tag] to [value] to change a value.&lt;br /&gt;
&lt;br /&gt;
===Tags===&lt;br /&gt;
There&#039;s a lot of GET/SET tags; I&#039;ll cover some of the more useful but less intuitive ones.&lt;br /&gt;
&lt;br /&gt;
*ACTIVATION: Whether the unit is on (true) or off (false).&lt;br /&gt;
*ARMORED: When true, any damage dealt to the unit will be multiplied by its damageModifier.&lt;br /&gt;
*PRINT: You can use GET PRINT to send up to 4 arguments to chat. Useful for debugging. Example: 	&#039;&#039;&#039;get PRINT(1, 5,9,10);&#039;&#039;&#039; statement will print the following into infolog: &#039;&#039;&#039;Value 1: 1, 2: 5, 3: 9, 4: 10&#039;&#039;&#039;&lt;br /&gt;
*VETERAN_LEVEL: The unit&#039;s experience times 100. Note that you can SET this via script, although the unit won&#039;t gain any extra health from doing so.&lt;br /&gt;
&lt;br /&gt;
=== Custom Variables ===&lt;br /&gt;
{{removed|101.0}}&lt;br /&gt;
Higher GET/SET numbers are reserved for custom variables. These are very useful for Lua integration. Setting these variables is much (perhaps 100x) faster than calling functions across Lua and COB; the disadvantages are the limited number of variables and the fact that the other side is not immediately notified of a change in the variable.&lt;br /&gt;
&lt;br /&gt;
*Unit variables: The 8 numbers starting at 1024 correspond to per-unit variables. To get at these from Lua, use Spring.[Get|Set]COBUnitVar.&lt;br /&gt;
*Team variables: The 64 numbers starting at 2048 correspond to per-team variables. To get at these from Lua, use Spring.[Get|Set]COBTeamVar.&lt;br /&gt;
*Ally variables: The 64 numbers starting at 3072 correspond to per-team variables. To get at these from Lua, use Spring.[Get|Set]COBAllyTeamVar.&lt;br /&gt;
*Global variables: The 4096 numbers starting at 4096 correspond to global variables. To get at these from Lua, use Spring.[Get|Set]COBGlobalVar.&lt;br /&gt;
&lt;br /&gt;
==emit-sfx==&lt;br /&gt;
&lt;br /&gt;
 emit-sfx [sfxtype] from [piece];&lt;br /&gt;
&lt;br /&gt;
The least significant byte of sfxtype is treated as an unsigned integer; the remaining bits are a bitmask. The bitmask indicates what &#039;&#039;type&#039;&#039; of sfx to emit, while the number indicates &#039;&#039;which&#039;&#039; sfx of that type to emit. The bits are as follows:&lt;br /&gt;
&lt;br /&gt;
*256: Point-based fx. Used for white smoke (1), black smoke (2), and bubbles (3).&lt;br /&gt;
*1024: Unit sfx. Use with the unit&#039;s sfxtypes.explosionGenerators. The first one is 0, the second one is 1, etc.&lt;br /&gt;
*2048: Fire weapon. Fires a weapon from the piece (no aiming involved). Again, the first weapon is 0, the second weapon is 1, etc.&lt;br /&gt;
*4096: Explode weapon. Detonates a weapon at the piece. Again, the first weapon is 0, the second weapon is 1, etc.&lt;br /&gt;
&lt;br /&gt;
If the piece has no geometry, then the sfx is emitted in the +z direction from the origin of the piece.&lt;br /&gt;
&lt;br /&gt;
If the piece has 1 vertex, the emit dir is the vector from the origin to the the position of the first vertex the emit position is the origin of the piece.&lt;br /&gt;
&lt;br /&gt;
If there is more than one vertex in the piece, then the emit vector is the vector pointing from v[0] to v[1], and the emit position is v[0].&lt;br /&gt;
&lt;br /&gt;
==explode==&lt;br /&gt;
&lt;br /&gt;
Causes the piece to explode and possibly go flying. This actually gives the appearance of making a copy of the piece (henceforth referred to as &amp;quot;debris&amp;quot;) so if you&#039;re using it outside of Killed() you may want to hide the piece in question.&lt;br /&gt;
&lt;br /&gt;
 explode [piece] type [exptype];&lt;br /&gt;
&lt;br /&gt;
exptype is a bitmask. The bits are as follows:&lt;br /&gt;
&lt;br /&gt;
*SHATTER: Explodes the debris into tiny triangles. Looks like confetti.&lt;br /&gt;
*EXPLODE_ON_HIT: Debris will explode on impact, causing about 40 damage.&lt;br /&gt;
*FALL: Debris is affected by gravity.&lt;br /&gt;
*SMOKE&lt;br /&gt;
*FIRE&lt;br /&gt;
*BITMAPONLY: No debris, just an explosion graphic.&lt;br /&gt;
*NOCEGTRAIL&lt;br /&gt;
*NOHEATCLOUD: No explosion before the piece flies off.&lt;br /&gt;
*BITMAP[1...5]: Not used in Spring, may overlap with Spring specific bits.&lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22595</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22595"/>
		<updated>2016-05-16T09:16:26Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;101.0.1-367-g9ba9e97&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22645</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22645"/>
		<updated>2016-05-16T09:16:18Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;16. May 2016&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22644</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22644"/>
		<updated>2016-05-14T12:33:54Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;14. May 2016&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22594</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22594"/>
		<updated>2016-05-14T12:33:53Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;101.0.1-353-gb82bb12&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22643</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22643"/>
		<updated>2016-05-03T20:50:17Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;03. May 2016&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22593</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22593"/>
		<updated>2016-05-03T20:50:12Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;101.0.1-323-gdc57279&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Hokomoko&amp;diff=20736</id>
		<title>User:Hokomoko</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Hokomoko&amp;diff=20736"/>
		<updated>2016-04-14T19:57:13Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I make spring go faster, fix bugs, inadvertently cause new bugs and then hunt those down and fix them as well.&lt;br /&gt;
&lt;br /&gt;
[https://springrts.com/phpbb/viewtopic.php?f=22&amp;amp;t=33702 This thread describes what I&#039;m doing with the engine]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/spring1944/spring1944 Check out Spring:1944!]&lt;br /&gt;
&lt;br /&gt;
Also check these two widgets:&lt;br /&gt;
# [https://gist.github.com/ashdnazg/3d4de5bae33e4f54cd40 Chili interface for drawing/sending tactical arrows on the map using markers. Contains Bezier curve handling code.]&lt;br /&gt;
# [https://gist.github.com/ashdnazg/3d4de5bae33e4f54cd40 Chili interface for taking control of an ally&#039;s units (assuming they have the widget as well).]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3716</id>
		<title>Building Spring on Windows</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3716"/>
		<updated>2016-03-24T08:49:28Z</updated>

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

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;12. March 2016&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22592</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22592"/>
		<updated>2016-03-12T21:33:15Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;101.0.1-136-g54d97ff&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10766</id>
		<title>Lua:Callins</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10766"/>
		<updated>2016-02-26T02:03:14Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Lua Callins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua Callins =&lt;br /&gt;
This page is future looking to unified widget/gadget (aka &amp;quot;addon&amp;quot;) handler, which may yet be some way off, c.f. the [https://github.com/spring/spring/blob/ebb704e008f6ea645947d07be1cfcc272af0428f/doc/changelog.txt#L71 changelog].&lt;br /&gt;
&lt;br /&gt;
For now, to use these addons in a widget, replace addon with widget and, for a gadget, replace addon with gadget. For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
        ...  &lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some functions may differ between (synced) gadget and widgets; those are in the [[#Synced_-_Unsynced_Shared]] section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented.&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Initialize&lt;br /&gt;
|params = &lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the addon is (re)loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Shutdown&lt;br /&gt;
|params = &lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the addon or the game is shutdown.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsynced Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DefaultCommand&lt;br /&gt;
|params = type, id&lt;br /&gt;
|return = number cmdID&lt;br /&gt;
|description = Used to set the default command when a unit is selected. First parameter is the type of the object pointed at (either &amp;quot;unit or &amp;quot;feature&amp;quot;) and the second is its unitID or featureID respectively. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandNotify&lt;br /&gt;
|params = cmdID, cmdParams, cmdOptions&lt;br /&gt;
|return = bool removeCmd&lt;br /&gt;
|description = Called when a command is issued. Returning &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; deletes the command and does not send it through the network.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandsChanged&lt;br /&gt;
|params = None&lt;br /&gt;
|return = ?&lt;br /&gt;
|description = Called when the command descriptions changed, e.g. when selecting or deselecting a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = WorldTooltip&lt;br /&gt;
|params = ttType, data1, data2, data3&lt;br /&gt;
|return = string newTooltip&lt;br /&gt;
|description = The parameters can be &amp;lt;code&amp;gt;&amp;quot;unit&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;unitID&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;&amp;quot;feature&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;featureID&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;&amp;quot;ground&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;posX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;posY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;posZ&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;selection&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnsyncedHeightMapUpdate&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the unsynced copy of the height-map is altered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameProgress&lt;br /&gt;
|params = serverFrameNum&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called every 60 frames, calculating delta between GameFrame and GameProgress. Can give an ETA about catching up with simulation for mid-game join players.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameSetup&lt;br /&gt;
|params =  state, ready, playerStates&lt;br /&gt;
|return = bool success, bool newReady&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = SunChanged&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AddConsoleLine&lt;br /&gt;
|params = msg, priority&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when text is entered into the console (e.g. Spring.Echo).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvSkirmishAIMessage&lt;br /&gt;
|params = aiTeam, dataStr&lt;br /&gt;
|return = ???&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvFromSynced&lt;br /&gt;
|params = ...&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Receives data sent via [[Lua_System#Synced|SendToUnsynced]] callout.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Save&lt;br /&gt;
|params = zip&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a chat command &#039;/save&#039; or &#039;/savegame&#039; is received. The single argument is a userdatum representing the savegame zip file. See [[Lua_SaveLoad#Save_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = LoadProgress&lt;br /&gt;
|params = message, replaceLastLine&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Only available to LuaIntro.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GroupChanged&lt;br /&gt;
|params = groupID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is added to or removed from a control group. Currently implemented for widgets only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ConfigureLayout&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = ???&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Input ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = IsAbove&lt;br /&gt;
|params = x, y&lt;br /&gt;
|return = bool isAbove&lt;br /&gt;
|description = Called every Update. Must return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;Mouse*&amp;lt;/code&amp;gt; events and &amp;lt;code&amp;gt;GetToolTip&amp;lt;/code&amp;gt; to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GetTooltip&lt;br /&gt;
|params = x, y&lt;br /&gt;
|return = string tooltip&lt;br /&gt;
|description = Called when &amp;lt;code&amp;gt;IsAbove&amp;lt;/code&amp;gt; returns true.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyPress&lt;br /&gt;
|params = key, mods, isRepeat&lt;br /&gt;
|return = bool becomeOwner&lt;br /&gt;
|description = Called repeatedly when a key is pressed down. If you want an action to occur only once check for &amp;lt;code&amp;gt;isRepeat == false&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;mods&amp;lt;/code&amp;gt; parameter is a table, with keys &amp;lt;code&amp;gt;alt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ctrl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;meta&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;shift&amp;lt;/code&amp;gt; each having a boolean value. Return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if you don&#039;t want other callins or the engine to also receive this keypress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyRelease&lt;br /&gt;
|params = key&lt;br /&gt;
|return = bool&lt;br /&gt;
|description = Called when the key is released.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TextInput&lt;br /&gt;
|params = utf8char&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called whenever a key press results in text input. Introduced in 97.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = JoystickEvent&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MousePress&lt;br /&gt;
|params = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|description = Called when a mouse button is pressed. The &amp;lt;code&amp;gt;button&amp;lt;/code&amp;gt; parameter supports up to 7 buttons. Must return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;MouseRelease&amp;lt;/code&amp;gt; and other functions to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseRelease&lt;br /&gt;
|params = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|description = Called when a mouse button is released. Please note that in order to have Spring call &amp;lt;code&amp;gt;MouseRelease&amp;lt;/code&amp;gt;, you need to have a &amp;lt;code&amp;gt;MousePress&amp;lt;/code&amp;gt; call-in in the same addon that returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseWheel&lt;br /&gt;
|params = up, value&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the mouse wheel is moved. The parameters indicate the direction and amount of travel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseMove&lt;br /&gt;
|params = x, y, dx, dy, button&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the mouse is moved. The &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;dy&amp;lt;/code&amp;gt; parameters indicate the distance travelled, whereas the first two indicate the final position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Players ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerChanged&lt;br /&gt;
|params = playerID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called whenever a player&#039;s status changes e.g. becoming a spectator.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerAdded&lt;br /&gt;
|params = playerID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called whenever a new player joins the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerRemoved&lt;br /&gt;
|params = playerID, reason&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called whenever a player is removed from the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Drawing ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ViewResize&lt;br /&gt;
|params = viewSizeX, viewSizeY&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called whenever the window is resized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Update&lt;br /&gt;
|params = dt&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called for every draw frame. The parameter is the time since the last update. Perform calculations in here and only drawing in Draw* callins.}}&lt;br /&gt;
&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|params =&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Doesn&#039;t render to screen! Use this callin to update textures, shaders, etc.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreUnit&lt;br /&gt;
|params = &lt;br /&gt;
|return = none&lt;br /&gt;
|description = Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorld&lt;br /&gt;
|params =&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldShadow&lt;br /&gt;
|params =&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldReflection&lt;br /&gt;
|params =&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldRefraction&lt;br /&gt;
|params =&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreen&lt;br /&gt;
|params = &lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenEffects&lt;br /&gt;
|params = vsx, vsy&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Where &amp;lt;code&amp;gt;vsx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vsy&amp;lt;/code&amp;gt; are screen coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawLoadScreen&lt;br /&gt;
|params =&lt;br /&gt;
|return = none&lt;br /&gt;
|description = {{new|95.0}} Only available to LuaIntro, draws custom load screens.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimap&lt;br /&gt;
|params = sx, sy&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Where &amp;lt;code&amp;gt;sx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sy&amp;lt;/code&amp;gt; are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimapBackground&lt;br /&gt;
|params = sx, sy&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Where &amp;lt;code&amp;gt;sx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sy&amp;lt;/code&amp;gt; are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Object Rendering ===&lt;br /&gt;
For the following calls &amp;lt;code&amp;gt;drawMode&amp;lt;/code&amp;gt; can be one of the following, &amp;lt;code&amp;gt;notDrawing = 0&amp;lt;/code&amp;gt;,	&amp;lt;code&amp;gt;normalDraw = 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shadowDraw = 2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reflectionDraw = 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;refractionDraw = 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnit&lt;br /&gt;
|params = unitID, drawMode&lt;br /&gt;
|return = bool suppressEngineDraw&lt;br /&gt;
|description = For custom rendering of units, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeature&lt;br /&gt;
|params = unitID, drawMode&lt;br /&gt;
|return = bool suppressEngineDraw&lt;br /&gt;
|description = For custom rendering of features, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawShield&lt;br /&gt;
|params = unitID, weaponID, drawMode&lt;br /&gt;
|return = bool suppressEngineDraw&lt;br /&gt;
|description = For custom rendering of [[Gamedev:WeaponDefs#Shield_(WeaponType)|shields]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawProjectile&lt;br /&gt;
|params = projectileID, drawMode&lt;br /&gt;
|return = bool suppressEngineDraw&lt;br /&gt;
|description = For custom rendering of weapon (&amp;amp; other) projectiles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced - Unsynced Shared ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GotChatMsg&lt;br /&gt;
|params = msg, player&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a player issues a UI command e.g. types &amp;lt;code&amp;gt;/foo&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/luarules foo&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameID&lt;br /&gt;
|params = gameID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called once to deliver the gameID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePaused&lt;br /&gt;
|params = &lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the game is paused.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|params = winningAllyTeams&lt;br /&gt;
|return = none&lt;br /&gt;
|description = The parameter is a list of winning allyTeams, if empty the game result was undecided (like when dropping from an host).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameFrame&lt;br /&gt;
|params = frame&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called for every game simulation frame (30 per second).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePreload&lt;br /&gt;
|params = &lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called before the 0 gameframe.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameStart&lt;br /&gt;
|params =&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called upon the start of the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamChanged&lt;br /&gt;
|params = teamID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamDied&lt;br /&gt;
|params = teamID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a team dies (see [[Lua_SyncedCtrl#Game_End|Spring.KillTeam]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCreated&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, builderID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called at the moment the unit is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFinished&lt;br /&gt;
|params = unitID, unitDefID, unitTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called at the moment the unit is completed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFromFactory&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, factID, factDefID, userOrders&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a factory finishes construction of a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitGiven&lt;br /&gt;
|params = unitID, unitDefID, newTeam, oldTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is transferred between teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitTaken&lt;br /&gt;
|params = unitID, unitDefID, oldTeam, newTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is transferred between teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDamaged&lt;br /&gt;
|params =  unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is damaged (after &amp;lt;code&amp;gt;UnitPreDamaged&amp;lt;/code&amp;gt;).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDestroyed&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitStunned&lt;br /&gt;
|params =  unitID, unitDefID, unitTeam, stunned&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit changes its stun status. {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnitCollision&lt;br /&gt;
|params = colliderID, collideeID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when two units collide. Both units must be registered with [[Lua_System#Synced|Script.SetWatchUnit]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFeatureCollision&lt;br /&gt;
|params = colliderID, collideeID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit collides with a feature. The unit must be registered with [[Lua_System#Synced|Script.SetWatchUnit]] and the feature registered with [[Lua_System#Synced|Script.SetWatchFeature]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCommand&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called after when a unit accepts a command, after &amp;lt;code&amp;gt;AllowCommand&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCmdDone&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit completes a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLoaded&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is loaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnloaded&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is unloaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitExperience&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, experience, oldExperience&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit gains experience greater or equal to the minimum limit set by calling [[Lua_SyncedCtrl#Other|Spring.SetExperienceGrade]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitIdle&lt;br /&gt;
|params = unitID, unitDefID, unitTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit is idle (empty command queue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCloaked&lt;br /&gt;
|params = unitID, unitDefID, unitTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit cloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDecloaked&lt;br /&gt;
|params = unitID, unitDefID, unitTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit decloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoved&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoveFailed&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = StockpileChanged&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a units stockpile of weapons increases or decreases. See {{xtaglink|Gamedev:WeaponDefs|stockpile}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredLos&lt;br /&gt;
|params = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit enters LOS of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftLos&lt;br /&gt;
|params = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit leaves LOS of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredRadar&lt;br /&gt;
|params = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit enters radar of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftRadar&lt;br /&gt;
|params = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit leaves radar of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredAir&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftAir&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredWater&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftWater&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitSeismicPing&lt;br /&gt;
|params = x, y, z, strength, allyTeam, unitID, unitDefID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a unit emits a seismic ping. See {{xtaglink|Gamedev:UnitDefs|seismicSignature}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureCreated&lt;br /&gt;
|params = featureID, allyTeamID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a feature is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDamaged&lt;br /&gt;
|params =  featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a feature is damaged.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDestroyed&lt;br /&gt;
|params = featureID, allyTeamID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when a feature is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureMoved&lt;br /&gt;
|params = ???&lt;br /&gt;
|return = none&lt;br /&gt;
|description = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Projectiles ===&lt;br /&gt;
The following Callins are only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileCreated&lt;br /&gt;
|params = proID, proOwnerID, weaponDefID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the projectile is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileDestroyed&lt;br /&gt;
|params = proID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called when the projectile is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced Only ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandFallback&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&lt;br /&gt;
|return = bool used, bool finished&lt;br /&gt;
|description = Called when the unit reaches an unknown command in its queue (i.e. one not handled by the engine). If no addon returns &amp;lt;code&amp;gt;used&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the command is dropped, if an addon returns &amp;lt;code&amp;gt;true, true&amp;lt;/code&amp;gt; the command is removed because it&#039;s done, with &amp;lt;code&amp;gt;true, false&amp;lt;/code&amp;gt; it&#039;s kept in the queue and &amp;lt;code&amp;gt;CommandFallback&amp;lt;/code&amp;gt; gets called again on the next slowupdate.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowCommand&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called when the command is given, before the unit&#039;s queue is altered. The return value is whether it should be let into the queue. The queue remains untouched when a command is blocked, whether it would be queued or replace the queue.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitCreation&lt;br /&gt;
|params = unitDefID, builderID, builderTeam, x, y, z, facing&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called just before unit is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitTransfer&lt;br /&gt;
|params = unitID, unitDefID, oldTeam, newTeam, capture&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called just before a unit is transferred to a different team, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitBuildStep&lt;br /&gt;
|params = builderID, builderTeam, unitID, unitDefID, part&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called just before a unit progresses its build percentage, the boolean return value determines whether or not the build makes progress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureCreation&lt;br /&gt;
|params = featureDefID, teamID, x, y, z&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called just before feature is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureBuildStep&lt;br /&gt;
|params = builderID, builderTeam, featureID, featureDefID, part&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called just before a feature progresses its build percentage, the boolean return value determines whether or not the progress change is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceLevel&lt;br /&gt;
|params = teamID, res, level&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called when a team sets the sharing level of a resource, the boolean return value determines whether or not the sharing level is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceTransfer&lt;br /&gt;
|params = oldTeamID, newTeamID, res, amount&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Called just before resources are transferred between players, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowStartPosition&lt;br /&gt;
|params =  clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = &amp;lt;code&amp;gt;clamped&amp;lt;/code&amp;gt; are the coordinates clamped into start-boxes, &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt; is where player tried to place their marker. The &amp;lt;code&amp;gt;readyState&amp;lt;/code&amp;gt; can be any one of &lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - player picked a position, &lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - player clicked ready, &lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - player pressed ready OR  the game was force-started (player did not click ready, but is now forcibly readied) or &lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; - the player failed to load. &lt;br /&gt;
* {{new|95.0}} the default &#039;failed to choose&#039; start-position is the north-west point of their startbox, or &amp;lt;code&amp;gt;(0,0,0)&amp;lt;/code&amp;gt; if they do not have a startbox. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDirectUnitControl&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, playerID&lt;br /&gt;
|return = bool allow&lt;br /&gt;
|description = Determines if this unit can be controlled directly in FPS view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTargetCheck&lt;br /&gt;
|params = attackerID, attackerWeaponNum, attackerWeaponDefID&lt;br /&gt;
|return = bool allowCheck, bool ignoreCheck&lt;br /&gt;
|description = Determines if this weapon can automatically generate targets itself. See also {{xtaglink|Gamedev:WeaponDefs|commandFire}} weaponDef tag. The &amp;lt;code&amp;gt;ignoreCheck&amp;lt;/code&amp;gt; return value was added in 99.0 to allow ignoring the callin i.e. running normal engine check for this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTarget&lt;br /&gt;
|params = attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defPriority&lt;br /&gt;
|return = bool allowed, number newPriority&lt;br /&gt;
|description = Controls blocking of a specific target from being considered during a weapon&#039;s periodic auto-targeting sweep. The second return value is the new priority for this target (if you don&#039;t want to change it, return defPriority). Lower priority targets are targeted first.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponInterceptTarget&lt;br /&gt;
|params = interceptorUnitID, interceptorWeaponID, targetProjectileID&lt;br /&gt;
|return = bool allowed&lt;br /&gt;
|description = Controls blocking of a specific intercept target from being considered during an {{xtaglink|Gamedev:WeaponDefs|interceptor}} weapon&#039;s periodic auto-targeting sweep. Only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowBuilderHoldFire&lt;br /&gt;
|params = unitID, unitDefID, action&lt;br /&gt;
|return = bool actionAllowed&lt;br /&gt;
|description = {{new|98.0}} {{Sourcelinkhash|5a82d750b89e72024bb0bb62cf05ea257737e0ac}}   Called when a construction unit wants to &amp;quot;use his nano beams&amp;quot;.&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; is one of following:&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; Build&lt;br /&gt;
* &amp;lt;code&amp;gt;CMD.REPAIR&amp;lt;/code&amp;gt; Repair&lt;br /&gt;
* &amp;lt;code&amp;gt;CMD.RECLAIM&amp;lt;/code&amp;gt; Reclaim&lt;br /&gt;
* &amp;lt;code&amp;gt;CMD.RESTORE&amp;lt;/code&amp;gt; Restore&lt;br /&gt;
* &amp;lt;code&amp;gt;CMD.RESURRECT&amp;lt;/code&amp;gt; Resurrect&lt;br /&gt;
* &amp;lt;code&amp;gt;CMD.CAPTURE&amp;lt;/code&amp;gt; Capture&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Explosion&lt;br /&gt;
|params = weaponDefID, px, py, pz, AttackerID&lt;br /&gt;
|return = bool noGfx&lt;br /&gt;
|description = Called when an explosion occurs. If it returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; then no graphical effects are drawn by the engine for this explosion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TerraformComplete&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&lt;br /&gt;
|return = bool stop&lt;br /&gt;
|description = Called when pre-building terrain levelling terraforms are completed (c.f. {{xtaglink|Gamedev:UnitDefs|levelGround}}). If the return value is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the current build order is terminated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MoveCtrlNotify&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, data&lt;br /&gt;
|return = bool moveCtrlComplete&lt;br /&gt;
|description = Enable both [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetCollideStop]] and [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetTrackGround]] to enable this call-in, data was supposed to indicate the type of notification but currently never has a value other than &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (&amp;quot;unit hit the ground&amp;quot;). The return value determines whether or not the unit should remain script-controlled (&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;) or return to engine controlled movement (&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvLuaMsg&lt;br /&gt;
|params = msg, playerID&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Receives messages from unsynced sent via [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaRulesMsg]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Load&lt;br /&gt;
|params = zip&lt;br /&gt;
|return = none&lt;br /&gt;
|description = Called after &amp;lt;code&amp;gt;GamePreload&amp;lt;/code&amp;gt; and before &amp;lt;code&amp;gt;GameStart&amp;lt;/code&amp;gt;. See [[Lua_SaveLoad#Load_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Damage Controllers ===&lt;br /&gt;
For the following callins, in addition to being a regular weapon, &amp;lt;code&amp;gt;weaponDefID&amp;lt;/code&amp;gt; may be one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* &amp;lt;code&amp;gt;-2&amp;lt;/code&amp;gt; - ground collision&lt;br /&gt;
* &amp;lt;code&amp;gt;-3&amp;lt;/code&amp;gt; - object collision&lt;br /&gt;
* &amp;lt;code&amp;gt;-4&amp;lt;/code&amp;gt; - fire damage&lt;br /&gt;
* &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt; - water damage&lt;br /&gt;
* &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt; - kill damage&lt;br /&gt;
* &amp;lt;code&amp;gt;-7&amp;lt;/code&amp;gt; - crush damage&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitPreDamaged&lt;br /&gt;
|params = unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = number newDamage, number impulseMult&lt;br /&gt;
|description = Called before damage is applied to the unit, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ShieldPreDamaged&lt;br /&gt;
|params = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile&lt;br /&gt;
|return = bool handleCollision&lt;br /&gt;
|description = Called before any engine shield-vs-projectile logic executes. If the return value is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the gadget handles the collision event and the engine does not remove the projectile.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeaturePreDamaged&lt;br /&gt;
|params = featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = number newDamage, number impulseMult&lt;br /&gt;
|description = Called before damage is applied to the feature, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22640</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22640"/>
		<updated>2016-02-15T18:51:31Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;15. February 2016&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22590</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22590"/>
		<updated>2016-02-15T18:51:28Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;100.0.1-1162-gefb8d7e&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22639</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22639"/>
		<updated>2016-02-11T20:01:10Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;11. February 2016&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22589</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22589"/>
		<updated>2016-02-11T20:00:59Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;100.0.1-1148-ge827fef&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22638</id>
		<title>Template:EngineVersion:Testing:ReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing:ReleaseDate&amp;diff=22638"/>
		<updated>2016-02-08T12:59:24Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;08. February 2016&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22588</id>
		<title>Template:EngineVersion:Testing</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:EngineVersion:Testing&amp;diff=22588"/>
		<updated>2016-02-08T12:58:20Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;100.0.1-1115-g0de46cd&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2321</id>
		<title>Authors</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2321"/>
		<updated>2016-02-07T23:34:35Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Active */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Authors=&lt;br /&gt;
&lt;br /&gt;
Spring (formerly TASpring) was originally written by the Swedish clan SY,&lt;br /&gt;
and later extended by a bunch of other people, some of whom are listed&lt;br /&gt;
here (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
==Active==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[User:abma|abma]]&#039;&#039;&#039; &#039;&#039;Python AI Interface, installer, infrastructure, tester&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cleanrock&#039;&#039;&#039; GFX, bug-fixes&lt;br /&gt;
* &#039;&#039;&#039;[[User:hokomoko|hokomoko]]&#039;&#039;&#039; Misc, optimisations, bug-fixes&lt;br /&gt;
* &#039;&#039;&#039;jK&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, sound, OpenMP, OS related&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Kloot&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, bug-fixes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Retired==&lt;br /&gt;
* Auswaschbar (Karl-Robert Ernst)&lt;br /&gt;
* fnordia&lt;br /&gt;
* &#039;&#039;&#039;[[User:hoijui|hoijui]]&#039;&#039;&#039; &#039;&#039;AI, build-system, installer, headless, sound&#039;&#039;&lt;br /&gt;
* imbaczek (Marek Baczynski)&lt;br /&gt;
* jcnossen&lt;br /&gt;
* SJ&lt;br /&gt;
* Tobi (Tobi Vollebregt) &#039;&#039;releases, buildbot, simulation, Lua&#039;&#039;&lt;br /&gt;
* [[User:Tim_Blokdijk|tim blokdijk]]&lt;br /&gt;
* trepan&lt;br /&gt;
* victor&lt;br /&gt;
* xiphux&lt;br /&gt;
* zerver &#039;&#039;GFX, simulation, Lua, multithreaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Special Thanks==&lt;br /&gt;
Additionally for significant contributions to the spring engine or the community, special gratitude goes to (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
* Beherith&lt;br /&gt;
* betalord&lt;br /&gt;
* bibim (Yann Riou)&lt;br /&gt;
* BrainDamage&lt;br /&gt;
* colorblind (Teake Nutma)&lt;br /&gt;
* dansan (for hosting replays.springrts.com)&lt;br /&gt;
* det&lt;br /&gt;
* eriatarka&lt;br /&gt;
* FLOZi (Craig Lawrence)&lt;br /&gt;
* [https://github.com/gajop gajop (Gajo Petrovic)]&lt;br /&gt;
* hughperkins (Hugh Perkins)&lt;br /&gt;
* ILMTitan&lt;br /&gt;
* initram&lt;br /&gt;
* KDR_11k&lt;br /&gt;
* koshi&lt;br /&gt;
* Krogothe&lt;br /&gt;
* M2&lt;br /&gt;
* MadrMan&lt;br /&gt;
* Nathaniel Smith&lt;br /&gt;
* Nicolas Brodu&lt;br /&gt;
* rattle&lt;br /&gt;
* satirik&lt;br /&gt;
* semi&lt;br /&gt;
* smoth&lt;br /&gt;
* SpliFF&lt;br /&gt;
* quantum&lt;br /&gt;
* zenzike (Nicolas Wu)&lt;br /&gt;
* zizu&lt;br /&gt;
* zydox (for sharing A LOT of CPU power for running the validation test / buildslave)&lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
&lt;br /&gt;
NEVER send bug reports, help- and feature-requests directly to the&lt;br /&gt;
persons in this list, use the [http://springrts.com/mantis/ bugtracker] or the [http://springrts.com/phpbb/ forum] instead.&lt;br /&gt;
Of course you are free to write mails about donating.&lt;br /&gt;
&lt;br /&gt;
For additions/corrections to the list, please post in the community forum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Engine Dev]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2320</id>
		<title>Authors</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Authors&amp;diff=2320"/>
		<updated>2016-02-07T23:33:45Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: 8 months bitches&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Authors=&lt;br /&gt;
&lt;br /&gt;
Spring (formerly TASpring) was originally written by the Swedish clan SY,&lt;br /&gt;
and later extended by a bunch of other people, some of whom are listed&lt;br /&gt;
here (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
==Active==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[User:abma|abma]]&#039;&#039;&#039; &#039;&#039;Python AI Interface, installer, infrastructure, tester&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cleanrock&#039;&#039;&#039; GFX, bug-fixes&lt;br /&gt;
* &#039;&#039;&#039;[[User:hokomoko|hokomoko]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;jK&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, sound, OpenMP, OS related&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Kloot&#039;&#039;&#039; &#039;&#039;GFX, simulation, Lua, bug-fixes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Retired==&lt;br /&gt;
* Auswaschbar (Karl-Robert Ernst)&lt;br /&gt;
* fnordia&lt;br /&gt;
* &#039;&#039;&#039;[[User:hoijui|hoijui]]&#039;&#039;&#039; &#039;&#039;AI, build-system, installer, headless, sound&#039;&#039;&lt;br /&gt;
* imbaczek (Marek Baczynski)&lt;br /&gt;
* jcnossen&lt;br /&gt;
* SJ&lt;br /&gt;
* Tobi (Tobi Vollebregt) &#039;&#039;releases, buildbot, simulation, Lua&#039;&#039;&lt;br /&gt;
* [[User:Tim_Blokdijk|tim blokdijk]]&lt;br /&gt;
* trepan&lt;br /&gt;
* victor&lt;br /&gt;
* xiphux&lt;br /&gt;
* zerver &#039;&#039;GFX, simulation, Lua, multithreaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Special Thanks==&lt;br /&gt;
Additionally for significant contributions to the spring engine or the community, special gratitude goes to (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
* Beherith&lt;br /&gt;
* betalord&lt;br /&gt;
* bibim (Yann Riou)&lt;br /&gt;
* BrainDamage&lt;br /&gt;
* colorblind (Teake Nutma)&lt;br /&gt;
* dansan (for hosting replays.springrts.com)&lt;br /&gt;
* det&lt;br /&gt;
* eriatarka&lt;br /&gt;
* FLOZi (Craig Lawrence)&lt;br /&gt;
* [https://github.com/gajop gajop (Gajo Petrovic)]&lt;br /&gt;
* hughperkins (Hugh Perkins)&lt;br /&gt;
* ILMTitan&lt;br /&gt;
* initram&lt;br /&gt;
* KDR_11k&lt;br /&gt;
* koshi&lt;br /&gt;
* Krogothe&lt;br /&gt;
* M2&lt;br /&gt;
* MadrMan&lt;br /&gt;
* Nathaniel Smith&lt;br /&gt;
* Nicolas Brodu&lt;br /&gt;
* rattle&lt;br /&gt;
* satirik&lt;br /&gt;
* semi&lt;br /&gt;
* smoth&lt;br /&gt;
* SpliFF&lt;br /&gt;
* quantum&lt;br /&gt;
* zenzike (Nicolas Wu)&lt;br /&gt;
* zizu&lt;br /&gt;
* zydox (for sharing A LOT of CPU power for running the validation test / buildslave)&lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
&lt;br /&gt;
NEVER send bug reports, help- and feature-requests directly to the&lt;br /&gt;
persons in this list, use the [http://springrts.com/mantis/ bugtracker] or the [http://springrts.com/phpbb/ forum] instead.&lt;br /&gt;
Of course you are free to write mails about donating.&lt;br /&gt;
&lt;br /&gt;
For additions/corrections to the list, please post in the community forum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Engine Dev]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Games&amp;diff=9076</id>
		<title>Games</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Games&amp;diff=9076"/>
		<updated>2016-01-19T00:02:54Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Open Source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__There are a number of games made for the Spring Engine. Some of the more popular ones are listed below, sorted by their terms of use. &amp;lt;!--(/license schemes?)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download games automatically, using your lobby (see [[Read_Me_First|Read Me First]]). &lt;br /&gt;
&lt;br /&gt;
Game can also be [[Getting_Spring_Content_and_Links|downloaded manually]], as sdz files, and placed into ../Spring/Games. Read the advice on [[Read_Me_First|this page]] if your lobby does not find your games. Some games also offer a stand-alone installer.&lt;br /&gt;
&lt;br /&gt;
=Open Source=&lt;br /&gt;
&#039;&#039;These games are all free to download and play and may be open to modifications, however, be sure to read the licenses before doing so.&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;300px&amp;quot; | &amp;lt;h2&amp;gt;[http://zero-k.info/ Zero-K]&amp;lt;/h2&amp;gt;&lt;br /&gt;
([http://code.google.com/p/zero-k/source/browse/trunk/mods/zk/legal.txt GPL, PD])&lt;br /&gt;
| width=40 |&lt;br /&gt;
|  | &amp;lt;h2&amp;gt;&#039;&#039;&#039;[http://spring1944.org/ Spring: 1944]&#039;&#039;&#039;&amp;lt;/h2&amp;gt;([https://github.com/spring1944/spring1944/blob/master/docs/License.txt CC-BY-NC])&lt;br /&gt;
|-&lt;br /&gt;
|  | {{navimgx|xsize=300|ysize=225|image=Zero-k_image.jpg|link=http://zero-k.info/}}&lt;br /&gt;
|&lt;br /&gt;
|  |{{navimgx|xsize=300|ysize=225|image=S44_tigers.jpg|link=http://spring1944.org}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | Zero-K is a fast, competitive game with a focus on a streamlined economy and advanced interface that takes the focus off tedious tasks and back on the action. A huge roster of interesting, unique units and a variety of unit abilities provides tremendous tactical and strategic depth to the game. [http://zero-k.info Download link]&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | Spring:1944 is a WWII themed game with four fully functional sides (US, Germany, USSR, Britain), period-accurate units and strengths. Realism comes second only to creating a game that is fun and accessible to play.&lt;br /&gt;
|-&lt;br /&gt;
|  | &amp;lt;h2&amp;gt;[http://www.evolutionrts.info Evolution RTS]&amp;lt;/h2&amp;gt;([http://creativecommons.org/licenses/by-nc-nd/3.0/us/ CC-BY-NC-ND])&lt;br /&gt;
| width=40 |&lt;br /&gt;
|  | &amp;lt;h2&amp;gt;[[Kernel Panic]]&amp;lt;/h2&amp;gt;([[Kernel_Panic#License:|FOSS, with only 2 FOSS maps]])&amp;lt;!-- Since you should be able to remove those, I wonâ€™t mark it as non-free. Other maps have non-free license or no license at all.) --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  valign=&amp;quot;top&amp;quot;| {{navimgx|xsize=300|ysize=188|image=Evoimg.jpg|link=http://www.evolutionrts.info}}&lt;br /&gt;
|&lt;br /&gt;
|  | {{navimg|xsize=300|ysize=225|image=Kernel_Panic_3.4.jpg|link=Kernel Panic}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | A new war is brewing. A violent conflict, between the Six Colonies, each one convinced that it was in the right, each one sure of its own ability to defeat its enemies. But they need Generals. They need soldiers. They need you.&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | A game based around combat &#039;&#039;&#039;inside&#039;&#039;&#039; a computer, with 3 unique sides: the System, the Hacker and the Network waging war in a matrix of DOOM! No resource economy exists in KP, with the only constraints being time and space.&lt;br /&gt;
|-&lt;br /&gt;
|  | &amp;lt;h2&amp;gt;&#039;&#039;&#039;[http://springfiles.com/spring/games/edge-1 On The Edge]&#039;&#039;&#039;&amp;lt;/h2&amp;gt;  (GPL, [http://creativecommons.org/licenses/by-nc-sa/3.0/us/ CC-BY-NC-SA])&lt;br /&gt;
|&lt;br /&gt;
|  | &amp;lt;h2&amp;gt;&#039;&#039;&#039;[http://www.moddb.com/games/conflict-terra Conflict Terra]&#039;&#039;&#039;&amp;lt;/h2&amp;gt;([http://code.google.com/p/conflictterra/source/browse/games/CT/License.txt FOSS])&amp;lt;!-- The sounds from EvoRTS were removed, so we&#039;re clean now. --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  |{{navimgx|xsize=300|ysize=225|image=start3.jpg||link=http://springfiles.com/spring/games/edge-1}}&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |{{navimgx|xsize=300|ysize=225|image=CT_Hojos.png|link=http://www.moddb.com/games/conflict-terra}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | First Spring MOBA with unique pre-game hero setup. Under heavy development. How to setup working the game read on [http://springrts.com/phpbb/viewtopic.php?f=55&amp;amp;t=31476 On The Edge forum thread]&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | A unique game with heavy emphasis on mobility and featuring Spring&#039;s first major &amp;quot;collect and drop-off&amp;quot; economy, Conflict Terra boasts a distinctive art style.  Play as one of two factions in an ever-changing battlefield as you struggle to come out on top.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; width=&amp;quot;300px&amp;quot; | &amp;lt;h2&amp;gt;[http://www.indiedb.com/games/the-cursed The Cursed]&amp;lt;/h2&amp;gt;&lt;br /&gt;
([http://creativecommons.org/licenses/by-nc-sa/4.0 CC-BY-NC-SA])&lt;br /&gt;
| width=40 |&lt;br /&gt;
| align=&amp;quot;center&amp;quot; width=&amp;quot;300px&amp;quot; | &amp;lt;h2&amp;gt;[http://www.metalfactions.pt Metal Factions]&amp;lt;/h2&amp;gt;&lt;br /&gt;
([http://www.metalfactions.pt/about.html#license CC-BY-ND, with GPL/PD code])&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{navimgx|xsize=300|ysize=225|image=cursed_logo.jpg|link=http://www.indiedb.com/games/the-cursed}}&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{navimgx|xsize=300|ysize=225|image=Mf_spring_wiki.jpg|link=http://www.metalfactions.pt}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | The game is about bones, undead, demons, space marines and magic settled in a futuristic environment. It is a fresh   mixture of gameplay elements from many popular RTS games like Starcraft and C&amp;amp;C. &lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | An evolving game that started as a TA mod and currently features four factions: AVEN, GEAR, CLAW and SPHERE. Commanders can morph to fit into different play styles and be easily revived. Economy scaling is more strictly tied to map control.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Proprietary=&lt;br /&gt;
&#039;&#039;These games may or may not be free to play. Modifying their content (i.e. the art assets) is not allowed without the game authors explicit permission, although the code is GPL and some games include large GPL-friendly content collections.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|  width=&amp;quot;300px&amp;quot; | &amp;lt;h2&amp;gt; [https://springrts.com/phpbb/viewforum.php?f=46 Star Wars: Imperial Winter] &amp;lt;/h2&amp;gt;&lt;br /&gt;
| width=40 |&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  | &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | {{navimgx|xsize=300|ysize=225|image=Imperial Winter assault.jpg|link=https://springrts.com/phpbb/viewforum.php?f=46}}&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | A Star Wars themed game set in the troubled post-Return of the Jedi era.&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=TA-derived=&lt;br /&gt;
&#039;&#039;At least parts of these games are derived from data of the  Total Annihilation game (copyright Atari). As such, their distribution is potentially in breach of copyright laws and therefore not officially endorsed by the Spring RTS team.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|  |  &amp;lt;h2&amp;gt; [http://springrts.com/wiki/Balanced_Annihilation Balanced Annihilation] &amp;lt;/h2&amp;gt;&lt;br /&gt;
| width=40 |&lt;br /&gt;
|  |  &amp;lt;h2&amp;gt; [http://springfiles.com/spring/games/tech-annihilation-8 Tech Annihilation] &amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  | {{navimgx|xsize=300|ysize=225|image=BAScreenShot.jpg|link=http://springrts.com/phpbb/viewforum.php?f=44}}&lt;br /&gt;
|&lt;br /&gt;
|  | {{navimgx|xsize=300|ysize=200|image=Tech_Annihilation.png|link=http://springfiles.com/spring/games/tech-annihilation-8}}&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | &lt;br /&gt;
Balanced Annihilation (BA) is a mature game and new versions feature only minor balance tweaks.&lt;br /&gt;
&lt;br /&gt;
BA gameplay develops in stages of progressively heavier units with a growing economy. Many strategies are viable in BA, including focusing on map control, aggression, defense, air power, sea power, or mobility.&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
| align=&amp;quot;justify&amp;quot; valign=&amp;quot;top&amp;quot; | This Game is bigger, greater and more epic! Tech your Commander from a tiny Commander to a Galactic Commander! (by &#039;&#039;[BoS]Senna&#039;&#039;, currently no homepage)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|  |  &amp;lt;h2&amp;gt;[http://nota.machys.net/downloads NOTA]&amp;lt;/h2&amp;gt;&lt;br /&gt;
| width=40 |&lt;br /&gt;
|  |  &amp;lt;h2&amp;gt; [[XTA]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  | {{navimgx|xsize=300|ysize=225|image=notAgame02.jpg|link=http://nota.machys.net/downloads}}&lt;br /&gt;
| width=40 |&lt;br /&gt;
|  | {{navimg|xsize=300|ysize=225|image=Screen508_s.jpg|link=XTA}}&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Not Original Total Annihilation is a rethink of the Total Annihilation universe with a focus on strategic, base oriented gameplay. With its revised unit scale, huge battles erupt engaging hundreds of units and scores of unit types. NOTA&#039;s completely rethought air and sea gameplay forces participation in all elements and places the tide of conflict in your hands.&lt;br /&gt;
| width=40 |&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  | Originally developed as a Total Annihilation game by the Swedish Yankspankers, XTA is the Original Public Game released with first versions of Spring. Development of this game by the SYs has stopped a while ago, but it is still played and actively developed by the community.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Installing Games in Spring=&lt;br /&gt;
Quite a few of the games listed above come with standalone installers, which makes things easy. Check their website to find out! &lt;br /&gt;
&lt;br /&gt;
In some cases however, the game will only distribute a game-file, for example &#039;&#039;BA750&#039;&#039;&#039;&#039;&#039;.sd7&#039;&#039;&#039; or &#039;&#039;XTA&#039;&#039;&#039;&#039;&#039;.sdz&#039;&#039;&#039;. For these games, you have to [[Download|install the stand-alone Spring-Engine]] first, and then place the game-file in the &#039;&#039;...\My Documents\My Games\Spring\Games\&#039;&#039; or &#039;&#039;...\Spring\games\&#039;&#039; folder (&#039;&#039;~/.spring/games/&#039;&#039; on Linux/Unix/Mac).&lt;br /&gt;
You may install multiple games in the same engine installation.&lt;br /&gt;
&lt;br /&gt;
To play a game, you also need a [[Maps|map]].&lt;br /&gt;
&lt;br /&gt;
Still not enough Games? There are [[Getting_Spring_Content_and_Links|some more]], not listed here or make your [[Game_and_Unit_development|own Game]]!&lt;br /&gt;
&lt;br /&gt;
[[Category: Games]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11784</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=11784"/>
		<updated>2016-01-15T21:39:16Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Unit Control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&#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 keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#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;
= Teams =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetAlly&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( number firstAllyTeamID, number secondAllyTeamID, boolean ally ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AssignPlayerToTeam&#039;&#039;&#039; {{new|98.0}}  {{Sourcelinkhash|7ed9a7e34814c60e5ae16281520cccc4daf3c367}}&lt;br /&gt;
  ( number playerID, number teamID)&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 | nil (meaning unit was not created)&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; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;userTarget &amp;amp; success new in version 95.0, setting nil target new in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number enemyUnitID | number x, number y, number z, | nil,&lt;br /&gt;
    [ boolean dgun = false ], [ boolean userTarget = false ] ) -&amp;gt;  success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number maxRange ) -&amp;gt; nil&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.SetUnitBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number unitID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&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;
This saves a lot of engine calls, by replacing:&lt;br /&gt;
function script.QueryNanoPiece() return currentpiece end&lt;br /&gt;
Use it!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPieceParent&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number AlteredPiece, number ParentPiece ) -&amp;gt; nil&lt;br /&gt;
Changes the pieces hierarchy of a unit, by attaching a piece to a new parent.&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;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#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 enable, &lt;br /&gt;
    number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetZ&lt;br /&gt;
    [, number volumeType [, number primaryAxis]]&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 goalx, number goaly, number goalz &lt;br /&gt;
  [, number goalRadius [, number moveSpeed [, bool moveRaw ]]] )&lt;br /&gt;
{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPhysics&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( 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;
    number dragx, number dragy, number dragz,&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;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID, number allyteamErrorSize &lt;br /&gt;
  [, number baseErrorSize [, number baseErrorMult ]]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID, number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
  number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z&lt;br /&gt;
  [ , number nextPosErrorUpdate]) --&amp;gt; nil&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;
&#039;&#039;&#039;Spring.SetUnitHarvestStorage&#039;&#039;&#039; {{new|97.0}}&lt;br /&gt;
  ( number unitid, number metal )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&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.SetFeatureVelocity&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePhysics&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
(like their feature counterparts at [[Lua_SyncedCtrl#Unit_Control]])&lt;br /&gt;
&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;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID, boolean blocking, boolean collidable) --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number featureID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&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;
  &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 z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, 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; | number cegID,&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 | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&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;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number 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;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&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; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&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;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&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 damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12040</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=12040"/>
		<updated>2016-01-15T21:36:10Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Unit Weapon Informations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(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; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&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;
=== 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;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Post 95.0 this no longer returns neutral units&amp;lt;/span&amp;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;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise&amp;lt;br/&amp;gt;&lt;br /&gt;
keep this in mind when using (not Spring.GetUnitIsDead())&amp;lt;/span&amp;gt;&lt;br /&gt;
&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.GetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number maxEngagementRange&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.GetUnitHarvestStorage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metal&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&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;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&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.GetUnitRotation&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   (number unitID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Marked as (WIP) in changelog&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;velw new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz, number velLength&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;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&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 | number raw |&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;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&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.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/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.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&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;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&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. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&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;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
&amp;quot;parent&amp;quot; field {{New|95.0}}&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;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table 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;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;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 = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table 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.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; 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; 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; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [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.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&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;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&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 [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&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;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&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.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&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 )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&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;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&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 [http://springrts.com/wiki/Animation-CobConstants#explode here]&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;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&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;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&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;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11783</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=11783"/>
		<updated>2016-01-15T21:35:20Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Unit Control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&#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 keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#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;
= Teams =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetAlly&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( number firstAllyTeamID, number secondAllyTeamID, boolean ally ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AssignPlayerToTeam&#039;&#039;&#039; {{new|98.0}}  {{Sourcelinkhash|7ed9a7e34814c60e5ae16281520cccc4daf3c367}}&lt;br /&gt;
  ( number playerID, number teamID)&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 | nil (meaning unit was not created)&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; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;userTarget &amp;amp; success new in version 95.0, setting nil target new in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number enemyUnitID | number x, number y, number z, | nil,&lt;br /&gt;
    [ boolean dgun = false ], [ boolean userTarget = false ] ) -&amp;gt;  success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number maxRange ) -&amp;gt; nil&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.SetUnitBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number unitID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&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;
This saves a lot of engine calls, by replacing:&lt;br /&gt;
function script.QueryNanoPiece() return currentpiece end&lt;br /&gt;
Use it!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPieceParent&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number AlteredPiece, number ParentPiece ) -&amp;gt; nil&lt;br /&gt;
Changes the pieces hierarchy of a unit, by attaching a piece to a new parent.&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;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#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 enable, &lt;br /&gt;
    number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetZ&lt;br /&gt;
    [, number volumeType [, number primaryAxis]]&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 goalx, number goaly, number goalz &lt;br /&gt;
  [, number goalRadius [, number moveSpeed [, bool moveRaw ]]] )&lt;br /&gt;
{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPhysics&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( 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;
    number dragx, number dragy, number dragz,&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;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID, number allyteamErrorSize &lt;br /&gt;
  [, number baseErrorSize [, number baseErrorMult ]]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID, number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
  number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z&lt;br /&gt;
  [ , number nextPosErrorUpdate]) --&amp;gt; nil&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;
&#039;&#039;&#039;Spring.SetUnitHarvestStorage&#039;&#039;&#039; {{new|97.0}}&lt;br /&gt;
  ( number unitid, number metal )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&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.SetFeatureVelocity&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePhysics&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
(like their feature counterparts at [[Lua_SyncedCtrl#Unit_Control]])&lt;br /&gt;
&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;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID, boolean blocking, boolean collidable) --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number featureID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&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;
  &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 z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, 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; | number cegID,&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 | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&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;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number 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;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&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; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&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;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&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 damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12039</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=12039"/>
		<updated>2016-01-14T12:46:11Z</updated>

		<summary type="html">&lt;p&gt;Hokomoko: /* Unit Weapon Informations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(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; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&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;
=== 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;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Post 95.0 this no longer returns neutral units&amp;lt;/span&amp;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;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise&amp;lt;br/&amp;gt;&lt;br /&gt;
keep this in mind when using (not Spring.GetUnitIsDead())&amp;lt;/span&amp;gt;&lt;br /&gt;
&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.GetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number maxEngagementRange&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.GetUnitHarvestStorage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metal&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&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;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&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.GetUnitRotation&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   (number unitID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Marked as (WIP) in changelog&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;velw new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz, number velLength&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;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&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 | number raw |&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;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&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.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&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;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/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.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&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;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&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. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&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;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
&amp;quot;parent&amp;quot; field {{New|95.0}}&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;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table 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;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;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 = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table 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.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; 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; 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; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [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.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&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;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&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 [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&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;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&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.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&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 )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&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;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&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 [http://springrts.com/wiki/Animation-CobConstants#explode here]&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;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&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;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&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;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Hokomoko</name></author>
	</entry>
</feed>