<?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=Kingraptor</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=Kingraptor"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Kingraptor"/>
	<updated>2026-11-09T00:36:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_CMDs&amp;diff=11174</id>
		<title>Lua CMDs</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_CMDs&amp;diff=11174"/>
		<updated>2018-04-15T10:34:17Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* IDs */&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;
== Options ==&lt;br /&gt;
&amp;lt;b id=CMD.OPT_ALT&amp;gt;CMD.OPT_ALT&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_CTRL&amp;gt;CMD.OPT_CTRL&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_SHIFT&amp;gt;CMD.OPT_SHIFT&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_RIGHT&amp;gt;CMD.OPT_RIGHT&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_INTERNAL&amp;gt;CMD.OPT_INTERNAL&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_META&amp;gt;CMD.OPT_META&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Waitcodes ==&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_TIME&amp;gt;CMD.WAITCODE_TIME&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_DEATH&amp;gt;CMD.WAITCODE_DEATH&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_SQUAD&amp;gt;CMD.WAITCODE_SQUAD&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_GATHER&amp;gt;CMD.WAITCODE_GATHER&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert/Remove Commands ==&lt;br /&gt;
To get the commandqueue use the following lua-call&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;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;First, said &amp;quot;tags&amp;quot; aka &amp;quot;id&amp;quot; are unique command identifiers, so each command that gets inserted into a unit&#039;s command &lt;br /&gt;
queue gets its unique &amp;quot;tag&amp;quot; number. (It is used to &#039;&#039;sync&#039;&#039; command queue operations, also it makes things much easier.)&lt;br /&gt;
Editors Note: I fucking hate it when open source devs use the word easy. It is a clear indicator that someone spends a whole day finding out about a well hidden simple concept. Well at least we are on this journey together :)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To look at those &amp;quot;tags&amp;quot; you can do the following:&lt;br /&gt;
   local cmdQueue = Spring.GetUnitCommands(unitID);&lt;br /&gt;
   if (#cmdQueue&amp;gt;0) then &lt;br /&gt;
      local cmdTag = cmdQueue[1].tag&lt;br /&gt;
      Spring.Echo(cmdTag)&lt;br /&gt;
      ..&lt;br /&gt;
   end&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMD.INSERT&amp;gt;CMD.INSERT&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  options.ALT     -&amp;gt; treat param0 as a position instead of a tag &lt;br /&gt;
  options.CONTROL -&amp;gt; use the build queue for factories &lt;br /&gt;
  params[0] = command tag or position (negative numbers to reference&lt;br /&gt;
  the back of the queue and 0 the first)&lt;br /&gt;
  params[1] = insertCmd id &lt;br /&gt;
  params[2] = insertCmd options (shift,alt,right click,etc.)&lt;br /&gt;
  params[3 ... N+2] = insertCmd params[0 ... N-1]&lt;br /&gt;
&lt;br /&gt;
  Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
    Spring.GiveOrderToUnit(unitID,&lt;br /&gt;
      CMD.INSERT,&lt;br /&gt;
      {-1,CMD.ATTACK,&#039;&#039;CMD.OPT_SHIFT&#039;&#039;,&#039;&#039;unitID2&#039;&#039;},&lt;br /&gt;
      {&amp;quot;alt&amp;quot;}&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Command structure dissection:&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;What to do with the command - in our case insert:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;CMD.INSERT&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;Place in the queue to insert:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;-1&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;Type of command to insert:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;CMD.ATTACK&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;Additional Information:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	If the unit is working down a shift queue, add it seemless into it&lt;br /&gt;
&lt;br /&gt;
		&#039;CMD.OPT_SHIFT&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;TargetID or Position:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;unitID2&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;The &#039;-1&#039; is the queue position and not a tag:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;{&amp;quot;alt&amp;quot;}&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if you insert cmd in pos 2 for example the rest of commands starting&lt;br /&gt;
  from 2 will be pushed back. &lt;br /&gt;
  Ilustration: {cmdA, cmdB, cmdC, cmdD} =&amp;gt; {cmdA, cmdB, NewCmd, cmdC, cmdD}&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  Note: If you didn&#039;t already notice, the command params and&lt;br /&gt;
        the command options are twisted in the array (compared to GiveOrder)!&lt;br /&gt;
  &amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  Note2: The command options in the array/table is a number value!&lt;br /&gt;
         You have to use CMD.OPT_* in this case.&lt;br /&gt;
  &amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  Note3: The inserted command doesn&#039;t go through allowcommand callins, only CMD.INSERT does.&lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.REMOVE&amp;gt;CMD.REMOVE&amp;lt;/b&amp;gt;&lt;br /&gt;
  options.ALT     -&amp;gt; use the parameters as commandIDs &lt;br /&gt;
  options.CONTROL -&amp;gt; use the build queue for factories &lt;br /&gt;
  params[0 ... N-1] = tags or commandIDs to remove&lt;br /&gt;
&lt;br /&gt;
No clues what the above mean translated, but here is a working example of how to delete a buildorder from a factory:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;   &lt;br /&gt;
 local facCmds = Spring.GetFactoryCommands(factoryID)&lt;br /&gt;
 &lt;br /&gt;
 if facCmds then -- nil check&lt;br /&gt;
	local cmd = facCmds[1]&lt;br /&gt;
	Spring.GiveOrderToUnit(factoryID, CMD.REMOVE, {i,cmd.tag}, {&amp;quot;ctrl&amp;quot;})&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note, the CMD[] table is bidirectional. That means: CMD[CMD.STOP] := &amp;quot;CMD_STOP&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMD.STOP&amp;gt;CMD.STOP&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.WAIT&amp;gt;CMD.WAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.TIMEWAIT&amp;gt;CMD.TIMEWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.NUMBER|CMDTYPE.NUMBER]]&lt;br /&gt;
&amp;lt;b id=CMD.DEATHWAIT&amp;gt;CMD.DEATHWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_RECTANGLE|CMDTYPE.ICON_UNIT_OR_RECTANGLE]]&lt;br /&gt;
&amp;lt;b id=CMD.SQUADWAIT&amp;gt;CMD.SQUADWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.NUMBER|CMDTYPE.NUMBER]]&lt;br /&gt;
&amp;lt;b id=CMD.GATHERWAIT&amp;gt;CMD.GATHERWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.MOVE&amp;gt;CMD.MOVE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.PATROL&amp;gt;CMD.PATROL&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.FIGHT&amp;gt;CMD.FIGHT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.ATTACK&amp;gt;CMD.ATTACK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_MAP|CMDTYPE.ICON_UNIT_OR_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.AREA_ATTACK&amp;gt;CMD.AREA_ATTACK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_AREA|CMDTYPE.ICON_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.GUARD&amp;gt;CMD.GUARD&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT|CMDTYPE.ICON_UNIT]]&lt;br /&gt;
&amp;lt;b id=CMD.AISELECT&amp;gt;CMD.AISELECT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.COMBO_BOX|CMDTYPE.COMBO_BOX]]&lt;br /&gt;
&amp;lt;b id=CMD.GROUPSELECT&amp;gt;CMD.GROUPSELECT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.GROUPADD&amp;gt;CMD.GROUPADD&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.GROUPCLEAR&amp;gt;CMD.GROUPCLEAR&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.REPAIR&amp;gt;CMD.REPAIR&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.FIRE_STATE&amp;gt;CMD.FIRE_STATE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.MOVE_STATE&amp;gt;CMD.MOVE_STATE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.SELFD&amp;gt;CMD.SELFD&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.LOAD_UNITS&amp;gt;CMD.LOAD_UNITS&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.LOAD_ONTO&amp;gt;CMD.LOAD_ONTO&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT|CMDTYPE.ICON_UNIT]]&lt;br /&gt;
&amp;lt;b id=CMD.UNLOAD_UNITS&amp;gt;CMD.UNLOAD_UNITS&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.UNLOAD_UNIT&amp;gt;CMD.UNLOAD_UNIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.ONOFF&amp;gt;CMD.ONOFF&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.RECLAIM&amp;gt;CMD.RECLAIM&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_FEATURE_OR_AREA|CMDTYPE.ICON_UNIT_FEATURE_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.CLOAK&amp;gt;CMD.CLOAK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.STOCKPILE&amp;gt;CMD.STOCKPILE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.DGUN&amp;gt;CMD.DGUN&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.RESTORE&amp;gt;CMD.RESTORE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_AREA|CMDTYPE.ICON_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.REPEAT&amp;gt;CMD.REPEAT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.TRAJECTORY&amp;gt;CMD.TRAJECTORY&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.RESURRECT&amp;gt;CMD.RESURRECT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_FEATURE_OR_AREA|CMDTYPE.ICON_UNIT_FEATURE_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.CAPTURE&amp;gt;CMD.CAPTURE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.AUTOREPAIRLEVEL&amp;gt;CMD.AUTOREPAIRLEVEL&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.LOOPBACKATTACK&amp;gt;CMD.LOOPBACKATTACK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.IDLEMODE&amp;gt;CMD.IDLEMODE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.SET_WANTED_MAX_SPEED&amp;gt;CMD.SET_WANTED_MAX_SPEED&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.NUMBER|CMDTYPE.NUMBER]]&lt;br /&gt;
&amp;lt;b id=CMD.SETBASE&amp;gt;CMD.SETBASE&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMD.INTERNAL&amp;gt;CMD.INTERNAL&amp;lt;/b&amp;gt;&lt;br /&gt;
  used in different ways&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;A negative number means build command&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The number is -unitDefID of the unittype that this command orders to be built.&lt;br /&gt;
   This means that build orders have no convenient CMD._____ string.&lt;br /&gt;
      The command id for build orders must always be a &amp;quot;minus&amp;quot; sign &amp;lt;i&amp;gt;appended to an integer value&amp;lt;/i&amp;gt;.&lt;br /&gt;
   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Spring.GiveOrderToUnit(unitID, &amp;lt;b&amp;gt;-(unitDefID)&amp;lt;/b&amp;gt;, {x,y,z(,facing)}, {&amp;quot;shift&amp;quot;})&amp;lt;/font&amp;gt;&lt;br /&gt;
      alternatively:&lt;br /&gt;
   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Spring.GiveOrderToUnit(unitID, &amp;lt;b&amp;gt;-UnitDefNames[&amp;quot;unitname&amp;quot;].id&amp;lt;/b&amp;gt;, {x,y,z(,facing)}, {&amp;quot;shift&amp;quot;})&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;b&amp;gt;&#039;facing&#039;&amp;lt;/b&amp;gt; is an optional integer parameter that controls unit&#039;s facing when placed.&lt;br /&gt;
      The values of (x,y,z) must &amp;lt;i&amp;gt;all&amp;lt;/i&amp;gt; be number values (like the number &amp;quot;0&amp;quot;), or the build order will break.&lt;br /&gt;
&lt;br /&gt;
== CommandTypes ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note, the CMDTYPE[] table is bidirectional. That means: CMDTYPE[CMDTYPE.ICON] := &amp;quot;CMDTYPE_ICON&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON&amp;gt;CMDTYPE.ICON&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 0 parameters in return&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_MODE&amp;gt;CMDTYPE.ICON_MODE&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (number selected mode)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_MAP&amp;gt;CMDTYPE.ICON_MAP&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 3 parameters in return (mappos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_AREA&amp;gt;CMDTYPE.ICON_AREA&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 4 parameters in return (mappos+radius)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT&amp;gt;CMDTYPE.ICON_UNIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameters in return (unitid)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_OR_MAP&amp;gt;CMDTYPE.ICON_UNIT_OR_MAP&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameters in return (unitid) or 3 parameters in return (mappos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_FRONT&amp;gt;CMDTYPE.ICON_FRONT&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 3 or 6 parameters in return (middle and right side of front if a front was defined)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.COMBO_BOX&amp;gt;CMDTYPE.COMBO_BOX&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (number selected option)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_OR_AREA&amp;gt;CMDTYPE.ICON_UNIT_OR_AREA&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (unitid) or 4 parameters in return (mappos+radius)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_FEATURE_OR_AREA&amp;gt;CMDTYPE.ICON_UNIT_FEATURE_OR_AREA&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (unitid or [[Lua_ConstGame#Engine|Game.maxUnits]]+featureid)&lt;br /&gt;
      or 4 parameters in return (mappos+radius)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_BUILDING&amp;gt;CMDTYPE.ICON_BUILDING&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 3 parameters in return (mappos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_OR_RECTANGLE&amp;gt;CMDTYPE.ICON_UNIT_OR_RECTANGLE&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (unitid)&lt;br /&gt;
      or 3 parameters in return (mappos)&lt;br /&gt;
      or 6 parameters in return (startpos+endpos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.NUMBER&amp;gt;CMDTYPE.NUMBER&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (number)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMDTYPE.CUSTOM&amp;gt;CMDTYPE.CUSTOM&amp;lt;/b&amp;gt;&lt;br /&gt;
  used with CMD_INTERNAL&lt;br /&gt;
&amp;lt;b id=CMDTYPE.NEXT&amp;gt;CMDTYPE.NEXT&amp;lt;/b&amp;gt; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;next command page&amp;lt;/font&amp;gt;&lt;br /&gt;
  used with CMD_INTERNAL&lt;br /&gt;
&amp;lt;b id=CMDTYPE.PREV&amp;gt;CMDTYPE.PREV&amp;lt;/b&amp;gt; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;previous command page&amp;lt;/font&amp;gt;&lt;br /&gt;
  used with CMD_INTERNAL&lt;br /&gt;
&lt;br /&gt;
== IDs ==&lt;br /&gt;
Below is a table of all CMD table entries and their IDs:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Command||ID&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_NONE||-1&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_NONE||-1&lt;br /&gt;
|-&lt;br /&gt;
|STOP||0&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_HOLDPOS||0&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_HOLDFIRE||0&lt;br /&gt;
|-&lt;br /&gt;
|INSERT||1&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_MANEUVER||1&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_RETURNFIRE||1&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_TIME||1&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_DEATH||2&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_ROAM||2&lt;br /&gt;
|-&lt;br /&gt;
|REMOVE||2&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_FIREATWILL||2&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_FIREATNEUTRAL||3&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_SQUAD||3&lt;br /&gt;
|-&lt;br /&gt;
|OPT_META||4&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_GATHER||4&lt;br /&gt;
|-&lt;br /&gt;
|WAIT||5&lt;br /&gt;
|-&lt;br /&gt;
|TIMEWAIT||6&lt;br /&gt;
|-&lt;br /&gt;
|DEATHWAIT||7&lt;br /&gt;
|-&lt;br /&gt;
|OPT_INTERNAL||8&lt;br /&gt;
|-&lt;br /&gt;
|SQUADWAIT||8&lt;br /&gt;
|-&lt;br /&gt;
|GATHERWAIT||9&lt;br /&gt;
|-&lt;br /&gt;
|MOVE||10&lt;br /&gt;
|-&lt;br /&gt;
|PATROL||15&lt;br /&gt;
|-&lt;br /&gt;
|FIGHT||16&lt;br /&gt;
|-&lt;br /&gt;
|OPT_RIGHT||16&lt;br /&gt;
|-&lt;br /&gt;
|LOOPBACKATTACK||20&lt;br /&gt;
|-&lt;br /&gt;
|ATTACK||20&lt;br /&gt;
|-&lt;br /&gt;
|AREA_ATTACK||21&lt;br /&gt;
|-&lt;br /&gt;
|GUARD||25&lt;br /&gt;
|-&lt;br /&gt;
|AISELECT||30&lt;br /&gt;
|-&lt;br /&gt;
|OPT_SHIFT||32&lt;br /&gt;
|-&lt;br /&gt;
|GROUPSELECT||35&lt;br /&gt;
|-&lt;br /&gt;
|GROUPADD||36&lt;br /&gt;
|-&lt;br /&gt;
|GROUPCLEAR||37&lt;br /&gt;
|-&lt;br /&gt;
|REPAIR||40&lt;br /&gt;
|-&lt;br /&gt;
|FIRE_STATE||45&lt;br /&gt;
|-&lt;br /&gt;
|MOVE_STATE||50&lt;br /&gt;
|-&lt;br /&gt;
|SETBASE||55&lt;br /&gt;
|-&lt;br /&gt;
|INTERNAL||60&lt;br /&gt;
|-&lt;br /&gt;
|OPT_CTRL||64&lt;br /&gt;
|-&lt;br /&gt;
|SELFD||65&lt;br /&gt;
|-&lt;br /&gt;
|SET_WANTED_MAX_SPEED||70&lt;br /&gt;
|-&lt;br /&gt;
|LOAD_UNITS||75&lt;br /&gt;
|-&lt;br /&gt;
|LOAD_ONTO||76&lt;br /&gt;
|-&lt;br /&gt;
|UNLOAD_UNITS||80&lt;br /&gt;
|-&lt;br /&gt;
|UNLOAD_UNIT||81&lt;br /&gt;
|-&lt;br /&gt;
|ONOFF||85&lt;br /&gt;
|-&lt;br /&gt;
|RECLAIM||90&lt;br /&gt;
|-&lt;br /&gt;
|CLOAK||95&lt;br /&gt;
|-&lt;br /&gt;
|STOCKPILE||100&lt;br /&gt;
|-&lt;br /&gt;
|MANUALFIRE||105&lt;br /&gt;
|-&lt;br /&gt;
|DGUN||105&lt;br /&gt;
|-&lt;br /&gt;
|RESTORE||110&lt;br /&gt;
|-&lt;br /&gt;
|REPEAT||115&lt;br /&gt;
|-&lt;br /&gt;
|TRAJECTORY||120&lt;br /&gt;
|-&lt;br /&gt;
|RESURRECT||125&lt;br /&gt;
|-&lt;br /&gt;
|OPT_ALT||128&lt;br /&gt;
|-&lt;br /&gt;
|CAPTURE||130&lt;br /&gt;
|-&lt;br /&gt;
|AUTOREPAIRLEVEL||135&lt;br /&gt;
|-&lt;br /&gt;
|IDLEMODE||145&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_CMDs&amp;diff=11173</id>
		<title>Lua CMDs</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_CMDs&amp;diff=11173"/>
		<updated>2018-04-15T10:33:47Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Add ID table&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;
== Options ==&lt;br /&gt;
&amp;lt;b id=CMD.OPT_ALT&amp;gt;CMD.OPT_ALT&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_CTRL&amp;gt;CMD.OPT_CTRL&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_SHIFT&amp;gt;CMD.OPT_SHIFT&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_RIGHT&amp;gt;CMD.OPT_RIGHT&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_INTERNAL&amp;gt;CMD.OPT_INTERNAL&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.OPT_META&amp;gt;CMD.OPT_META&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Waitcodes ==&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_TIME&amp;gt;CMD.WAITCODE_TIME&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_DEATH&amp;gt;CMD.WAITCODE_DEATH&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_SQUAD&amp;gt;CMD.WAITCODE_SQUAD&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.WAITCODE_GATHER&amp;gt;CMD.WAITCODE_GATHER&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert/Remove Commands ==&lt;br /&gt;
To get the commandqueue use the following lua-call&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;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;First, said &amp;quot;tags&amp;quot; aka &amp;quot;id&amp;quot; are unique command identifiers, so each command that gets inserted into a unit&#039;s command &lt;br /&gt;
queue gets its unique &amp;quot;tag&amp;quot; number. (It is used to &#039;&#039;sync&#039;&#039; command queue operations, also it makes things much easier.)&lt;br /&gt;
Editors Note: I fucking hate it when open source devs use the word easy. It is a clear indicator that someone spends a whole day finding out about a well hidden simple concept. Well at least we are on this journey together :)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To look at those &amp;quot;tags&amp;quot; you can do the following:&lt;br /&gt;
   local cmdQueue = Spring.GetUnitCommands(unitID);&lt;br /&gt;
   if (#cmdQueue&amp;gt;0) then &lt;br /&gt;
      local cmdTag = cmdQueue[1].tag&lt;br /&gt;
      Spring.Echo(cmdTag)&lt;br /&gt;
      ..&lt;br /&gt;
   end&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMD.INSERT&amp;gt;CMD.INSERT&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  options.ALT     -&amp;gt; treat param0 as a position instead of a tag &lt;br /&gt;
  options.CONTROL -&amp;gt; use the build queue for factories &lt;br /&gt;
  params[0] = command tag or position (negative numbers to reference&lt;br /&gt;
  the back of the queue and 0 the first)&lt;br /&gt;
  params[1] = insertCmd id &lt;br /&gt;
  params[2] = insertCmd options (shift,alt,right click,etc.)&lt;br /&gt;
  params[3 ... N+2] = insertCmd params[0 ... N-1]&lt;br /&gt;
&lt;br /&gt;
  Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
    Spring.GiveOrderToUnit(unitID,&lt;br /&gt;
      CMD.INSERT,&lt;br /&gt;
      {-1,CMD.ATTACK,&#039;&#039;CMD.OPT_SHIFT&#039;&#039;,&#039;&#039;unitID2&#039;&#039;},&lt;br /&gt;
      {&amp;quot;alt&amp;quot;}&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Command structure dissection:&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;What to do with the command - in our case insert:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;CMD.INSERT&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;Place in the queue to insert:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;-1&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;Type of command to insert:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;CMD.ATTACK&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;Additional Information:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	If the unit is working down a shift queue, add it seemless into it&lt;br /&gt;
&lt;br /&gt;
		&#039;CMD.OPT_SHIFT&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;TargetID or Position:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;unitID2&#039;&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;The &#039;-1&#039; is the queue position and not a tag:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		&#039;{&amp;quot;alt&amp;quot;}&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if you insert cmd in pos 2 for example the rest of commands starting&lt;br /&gt;
  from 2 will be pushed back. &lt;br /&gt;
  Ilustration: {cmdA, cmdB, cmdC, cmdD} =&amp;gt; {cmdA, cmdB, NewCmd, cmdC, cmdD}&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  Note: If you didn&#039;t already notice, the command params and&lt;br /&gt;
        the command options are twisted in the array (compared to GiveOrder)!&lt;br /&gt;
  &amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  Note2: The command options in the array/table is a number value!&lt;br /&gt;
         You have to use CMD.OPT_* in this case.&lt;br /&gt;
  &amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  Note3: The inserted command doesn&#039;t go through allowcommand callins, only CMD.INSERT does.&lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;b id=CMD.REMOVE&amp;gt;CMD.REMOVE&amp;lt;/b&amp;gt;&lt;br /&gt;
  options.ALT     -&amp;gt; use the parameters as commandIDs &lt;br /&gt;
  options.CONTROL -&amp;gt; use the build queue for factories &lt;br /&gt;
  params[0 ... N-1] = tags or commandIDs to remove&lt;br /&gt;
&lt;br /&gt;
No clues what the above mean translated, but here is a working example of how to delete a buildorder from a factory:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;   &lt;br /&gt;
 local facCmds = Spring.GetFactoryCommands(factoryID)&lt;br /&gt;
 &lt;br /&gt;
 if facCmds then -- nil check&lt;br /&gt;
	local cmd = facCmds[1]&lt;br /&gt;
	Spring.GiveOrderToUnit(factoryID, CMD.REMOVE, {i,cmd.tag}, {&amp;quot;ctrl&amp;quot;})&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note, the CMD[] table is bidirectional. That means: CMD[CMD.STOP] := &amp;quot;CMD_STOP&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMD.STOP&amp;gt;CMD.STOP&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.WAIT&amp;gt;CMD.WAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.TIMEWAIT&amp;gt;CMD.TIMEWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.NUMBER|CMDTYPE.NUMBER]]&lt;br /&gt;
&amp;lt;b id=CMD.DEATHWAIT&amp;gt;CMD.DEATHWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_RECTANGLE|CMDTYPE.ICON_UNIT_OR_RECTANGLE]]&lt;br /&gt;
&amp;lt;b id=CMD.SQUADWAIT&amp;gt;CMD.SQUADWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.NUMBER|CMDTYPE.NUMBER]]&lt;br /&gt;
&amp;lt;b id=CMD.GATHERWAIT&amp;gt;CMD.GATHERWAIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.MOVE&amp;gt;CMD.MOVE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.PATROL&amp;gt;CMD.PATROL&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.FIGHT&amp;gt;CMD.FIGHT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.ATTACK&amp;gt;CMD.ATTACK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_MAP|CMDTYPE.ICON_UNIT_OR_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.AREA_ATTACK&amp;gt;CMD.AREA_ATTACK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_AREA|CMDTYPE.ICON_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.GUARD&amp;gt;CMD.GUARD&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT|CMDTYPE.ICON_UNIT]]&lt;br /&gt;
&amp;lt;b id=CMD.AISELECT&amp;gt;CMD.AISELECT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.COMBO_BOX|CMDTYPE.COMBO_BOX]]&lt;br /&gt;
&amp;lt;b id=CMD.GROUPSELECT&amp;gt;CMD.GROUPSELECT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.GROUPADD&amp;gt;CMD.GROUPADD&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.GROUPCLEAR&amp;gt;CMD.GROUPCLEAR&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.REPAIR&amp;gt;CMD.REPAIR&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.FIRE_STATE&amp;gt;CMD.FIRE_STATE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.MOVE_STATE&amp;gt;CMD.MOVE_STATE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.SELFD&amp;gt;CMD.SELFD&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.LOAD_UNITS&amp;gt;CMD.LOAD_UNITS&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.LOAD_ONTO&amp;gt;CMD.LOAD_ONTO&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT|CMDTYPE.ICON_UNIT]]&lt;br /&gt;
&amp;lt;b id=CMD.UNLOAD_UNITS&amp;gt;CMD.UNLOAD_UNITS&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.UNLOAD_UNIT&amp;gt;CMD.UNLOAD_UNIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.ONOFF&amp;gt;CMD.ONOFF&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.RECLAIM&amp;gt;CMD.RECLAIM&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_FEATURE_OR_AREA|CMDTYPE.ICON_UNIT_FEATURE_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.CLOAK&amp;gt;CMD.CLOAK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.STOCKPILE&amp;gt;CMD.STOCKPILE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON|CMDTYPE.ICON]]&lt;br /&gt;
&amp;lt;b id=CMD.DGUN&amp;gt;CMD.DGUN&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MAP|CMDTYPE.ICON_MAP]]&lt;br /&gt;
&amp;lt;b id=CMD.RESTORE&amp;gt;CMD.RESTORE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_AREA|CMDTYPE.ICON_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.REPEAT&amp;gt;CMD.REPEAT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.TRAJECTORY&amp;gt;CMD.TRAJECTORY&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.RESURRECT&amp;gt;CMD.RESURRECT&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_FEATURE_OR_AREA|CMDTYPE.ICON_UNIT_FEATURE_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.CAPTURE&amp;gt;CMD.CAPTURE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_UNIT_OR_AREA|CMDTYPE.ICON_UNIT_OR_AREA]]&lt;br /&gt;
&amp;lt;b id=CMD.AUTOREPAIRLEVEL&amp;gt;CMD.AUTOREPAIRLEVEL&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.LOOPBACKATTACK&amp;gt;CMD.LOOPBACKATTACK&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.IDLEMODE&amp;gt;CMD.IDLEMODE&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.ICON_MODE|CMDTYPE.ICON_MODE]]&lt;br /&gt;
&amp;lt;b id=CMD.SET_WANTED_MAX_SPEED&amp;gt;CMD.SET_WANTED_MAX_SPEED&amp;lt;/b&amp;gt;&lt;br /&gt;
  type [[Lua_CMDs#CMDTYPE.NUMBER|CMDTYPE.NUMBER]]&lt;br /&gt;
&amp;lt;b id=CMD.SETBASE&amp;gt;CMD.SETBASE&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMD.INTERNAL&amp;gt;CMD.INTERNAL&amp;lt;/b&amp;gt;&lt;br /&gt;
  used in different ways&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;A negative number means build command&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The number is -unitDefID of the unittype that this command orders to be built.&lt;br /&gt;
   This means that build orders have no convenient CMD._____ string.&lt;br /&gt;
      The command id for build orders must always be a &amp;quot;minus&amp;quot; sign &amp;lt;i&amp;gt;appended to an integer value&amp;lt;/i&amp;gt;.&lt;br /&gt;
   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Spring.GiveOrderToUnit(unitID, &amp;lt;b&amp;gt;-(unitDefID)&amp;lt;/b&amp;gt;, {x,y,z(,facing)}, {&amp;quot;shift&amp;quot;})&amp;lt;/font&amp;gt;&lt;br /&gt;
      alternatively:&lt;br /&gt;
   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Spring.GiveOrderToUnit(unitID, &amp;lt;b&amp;gt;-UnitDefNames[&amp;quot;unitname&amp;quot;].id&amp;lt;/b&amp;gt;, {x,y,z(,facing)}, {&amp;quot;shift&amp;quot;})&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;b&amp;gt;&#039;facing&#039;&amp;lt;/b&amp;gt; is an optional integer parameter that controls unit&#039;s facing when placed.&lt;br /&gt;
      The values of (x,y,z) must &amp;lt;i&amp;gt;all&amp;lt;/i&amp;gt; be number values (like the number &amp;quot;0&amp;quot;), or the build order will break.&lt;br /&gt;
&lt;br /&gt;
== CommandTypes ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note, the CMDTYPE[] table is bidirectional. That means: CMDTYPE[CMDTYPE.ICON] := &amp;quot;CMDTYPE_ICON&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON&amp;gt;CMDTYPE.ICON&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 0 parameters in return&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_MODE&amp;gt;CMDTYPE.ICON_MODE&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (number selected mode)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_MAP&amp;gt;CMDTYPE.ICON_MAP&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 3 parameters in return (mappos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_AREA&amp;gt;CMDTYPE.ICON_AREA&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 4 parameters in return (mappos+radius)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT&amp;gt;CMDTYPE.ICON_UNIT&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameters in return (unitid)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_OR_MAP&amp;gt;CMDTYPE.ICON_UNIT_OR_MAP&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameters in return (unitid) or 3 parameters in return (mappos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_FRONT&amp;gt;CMDTYPE.ICON_FRONT&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 3 or 6 parameters in return (middle and right side of front if a front was defined)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.COMBO_BOX&amp;gt;CMDTYPE.COMBO_BOX&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (number selected option)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_OR_AREA&amp;gt;CMDTYPE.ICON_UNIT_OR_AREA&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (unitid) or 4 parameters in return (mappos+radius)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_FEATURE_OR_AREA&amp;gt;CMDTYPE.ICON_UNIT_FEATURE_OR_AREA&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (unitid or [[Lua_ConstGame#Engine|Game.maxUnits]]+featureid)&lt;br /&gt;
      or 4 parameters in return (mappos+radius)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_BUILDING&amp;gt;CMDTYPE.ICON_BUILDING&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 3 parameters in return (mappos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.ICON_UNIT_OR_RECTANGLE&amp;gt;CMDTYPE.ICON_UNIT_OR_RECTANGLE&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (unitid)&lt;br /&gt;
      or 3 parameters in return (mappos)&lt;br /&gt;
      or 6 parameters in return (startpos+endpos)&lt;br /&gt;
&amp;lt;b id=CMDTYPE.NUMBER&amp;gt;CMDTYPE.NUMBER&amp;lt;/b&amp;gt;&lt;br /&gt;
  expect 1 parameter in return (number)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b id=CMDTYPE.CUSTOM&amp;gt;CMDTYPE.CUSTOM&amp;lt;/b&amp;gt;&lt;br /&gt;
  used with CMD_INTERNAL&lt;br /&gt;
&amp;lt;b id=CMDTYPE.NEXT&amp;gt;CMDTYPE.NEXT&amp;lt;/b&amp;gt; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;next command page&amp;lt;/font&amp;gt;&lt;br /&gt;
  used with CMD_INTERNAL&lt;br /&gt;
&amp;lt;b id=CMDTYPE.PREV&amp;gt;CMDTYPE.PREV&amp;lt;/b&amp;gt; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;previous command page&amp;lt;/font&amp;gt;&lt;br /&gt;
  used with CMD_INTERNAL&lt;br /&gt;
&lt;br /&gt;
== IDs ==&lt;br /&gt;
Below is a table of all commands and their IDs:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Command||ID&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_NONE||-1&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_NONE||-1&lt;br /&gt;
|-&lt;br /&gt;
|STOP||0&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_HOLDPOS||0&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_HOLDFIRE||0&lt;br /&gt;
|-&lt;br /&gt;
|INSERT||1&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_MANEUVER||1&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_RETURNFIRE||1&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_TIME||1&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_DEATH||2&lt;br /&gt;
|-&lt;br /&gt;
|MOVESTATE_ROAM||2&lt;br /&gt;
|-&lt;br /&gt;
|REMOVE||2&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_FIREATWILL||2&lt;br /&gt;
|-&lt;br /&gt;
|FIRESTATE_FIREATNEUTRAL||3&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_SQUAD||3&lt;br /&gt;
|-&lt;br /&gt;
|OPT_META||4&lt;br /&gt;
|-&lt;br /&gt;
|WAITCODE_GATHER||4&lt;br /&gt;
|-&lt;br /&gt;
|WAIT||5&lt;br /&gt;
|-&lt;br /&gt;
|TIMEWAIT||6&lt;br /&gt;
|-&lt;br /&gt;
|DEATHWAIT||7&lt;br /&gt;
|-&lt;br /&gt;
|OPT_INTERNAL||8&lt;br /&gt;
|-&lt;br /&gt;
|SQUADWAIT||8&lt;br /&gt;
|-&lt;br /&gt;
|GATHERWAIT||9&lt;br /&gt;
|-&lt;br /&gt;
|MOVE||10&lt;br /&gt;
|-&lt;br /&gt;
|PATROL||15&lt;br /&gt;
|-&lt;br /&gt;
|FIGHT||16&lt;br /&gt;
|-&lt;br /&gt;
|OPT_RIGHT||16&lt;br /&gt;
|-&lt;br /&gt;
|LOOPBACKATTACK||20&lt;br /&gt;
|-&lt;br /&gt;
|ATTACK||20&lt;br /&gt;
|-&lt;br /&gt;
|AREA_ATTACK||21&lt;br /&gt;
|-&lt;br /&gt;
|GUARD||25&lt;br /&gt;
|-&lt;br /&gt;
|AISELECT||30&lt;br /&gt;
|-&lt;br /&gt;
|OPT_SHIFT||32&lt;br /&gt;
|-&lt;br /&gt;
|GROUPSELECT||35&lt;br /&gt;
|-&lt;br /&gt;
|GROUPADD||36&lt;br /&gt;
|-&lt;br /&gt;
|GROUPCLEAR||37&lt;br /&gt;
|-&lt;br /&gt;
|REPAIR||40&lt;br /&gt;
|-&lt;br /&gt;
|FIRE_STATE||45&lt;br /&gt;
|-&lt;br /&gt;
|MOVE_STATE||50&lt;br /&gt;
|-&lt;br /&gt;
|SETBASE||55&lt;br /&gt;
|-&lt;br /&gt;
|INTERNAL||60&lt;br /&gt;
|-&lt;br /&gt;
|OPT_CTRL||64&lt;br /&gt;
|-&lt;br /&gt;
|SELFD||65&lt;br /&gt;
|-&lt;br /&gt;
|SET_WANTED_MAX_SPEED||70&lt;br /&gt;
|-&lt;br /&gt;
|LOAD_UNITS||75&lt;br /&gt;
|-&lt;br /&gt;
|LOAD_ONTO||76&lt;br /&gt;
|-&lt;br /&gt;
|UNLOAD_UNITS||80&lt;br /&gt;
|-&lt;br /&gt;
|UNLOAD_UNIT||81&lt;br /&gt;
|-&lt;br /&gt;
|ONOFF||85&lt;br /&gt;
|-&lt;br /&gt;
|RECLAIM||90&lt;br /&gt;
|-&lt;br /&gt;
|CLOAK||95&lt;br /&gt;
|-&lt;br /&gt;
|STOCKPILE||100&lt;br /&gt;
|-&lt;br /&gt;
|MANUALFIRE||105&lt;br /&gt;
|-&lt;br /&gt;
|DGUN||105&lt;br /&gt;
|-&lt;br /&gt;
|RESTORE||110&lt;br /&gt;
|-&lt;br /&gt;
|REPEAT||115&lt;br /&gt;
|-&lt;br /&gt;
|TRAJECTORY||120&lt;br /&gt;
|-&lt;br /&gt;
|RESURRECT||125&lt;br /&gt;
|-&lt;br /&gt;
|OPT_ALT||128&lt;br /&gt;
|-&lt;br /&gt;
|CAPTURE||130&lt;br /&gt;
|-&lt;br /&gt;
|AUTOREPAIRLEVEL||135&lt;br /&gt;
|-&lt;br /&gt;
|IDLEMODE||145&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12052</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=12052"/>
		<updated>2017-02-12T06:03:35Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* RulesParams */ Update Get*RulesParams return values (102.0)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== 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 | { [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 | { [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 | { [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.GetUnitMass&#039;&#039;&#039; {{new|101.0}}&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.GetUnitFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number featureID [, boolean 2D] ) -&amp;gt; nil | number distance&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;
&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 LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&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;
&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; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&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;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&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;
&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;
&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;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&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;
&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;
As of 101.0 this is 1-based piece index argument (was 0-based).&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.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&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;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&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.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, 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;
&#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;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&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>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SaveLoad&amp;diff=11571</id>
		<title>Lua SaveLoad</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SaveLoad&amp;diff=11571"/>
		<updated>2017-01-13T07:19:50Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Lua Save/Load support =&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Engine save/load has been broken/unstable for a very long time. I believe the major reasons for this were:&lt;br /&gt;
&lt;br /&gt;
* In particular for loading too much special code paths were traversed, that were not used for anything else (e.g. creg_Serialize and creg_PostLoad functions in many classes);&lt;br /&gt;
* Each class was responsible for it&#039;s own saving and loading;&lt;br /&gt;
* The code for loading was spread out over many classes;&lt;br /&gt;
* Save/load using CREG was extremely slow.&lt;br /&gt;
* Savegames created using CREG were bound to be incompatible between different Spring versions because they relied inherently on the implementation details of every single class involved;&lt;br /&gt;
* The save/load system strived to be 100% perfect, saving every single detail.&lt;br /&gt;
* No clear way to save Lua states (without making Lua aware of it)&lt;br /&gt;
&lt;br /&gt;
I realised we have a pretty decent and reasonably stable Lua interface. So why use this for save/load:&lt;br /&gt;
&lt;br /&gt;
* The code has been tested in practice (it&#039;s used in widgets and gadgets);&lt;br /&gt;
* The interface is reasonably stable, so savegames can be compatible between different Spring versions;&lt;br /&gt;
* Not a single class needs special support for save/load, as save/load uses existing APIs.&lt;br /&gt;
* By simply using the standard call-in mechanism any gadgets can save some state if that is desired. The save/load gadget does not need to get special treatment at all.&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=23&amp;amp;t=21805 Argh] and [http://springrts.com/phpbb/viewtopic.php?f=23&amp;amp;t=21836 zwzsg] had this idea too and implement save/load using Lua only. This is a little bit hacky and it is slow when saving large amounts of data such as e.g. the modified terrain heightmap.&lt;br /&gt;
&lt;br /&gt;
Hence Lua save/load brings engine support for Lua save/load :-)&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
&lt;br /&gt;
Instead of having the engine be responsible for serializing every bit of gamestate to disk, Lua save/load transfers most of the responsibility to the game (developer). The game developer can decide what objects and what properties are important to save, and ultimately a gadget could be created that could be drag &#039;n dropped in nearly any game. (Argh&#039;s and zwzsg&#039;s code would be useful for this.)&lt;br /&gt;
&lt;br /&gt;
There are two new call-ins: Load and Save, that allow a Lua save/load system to seamlessly integrate with other interfaces of the engine (e.g. commandline, lobby). Load is called by the engine if it has been instructed to load a game. Save is called by the engine whenever the chat command &#039;/save &amp;lt;filename&amp;gt;&#039; or &#039;/savegame&#039; is given. Both get a userdatum as argument. Using the methods open, read and write on this userdatum the Lua code can read/write chunks of data.&lt;br /&gt;
&lt;br /&gt;
At this moment existing code for reading and writing zip files has been re-used for Lua save/load, so savegames are simply renamed zip files (.ssf)&lt;br /&gt;
&lt;br /&gt;
== Chat commands ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/save [-y] &amp;lt;filename&amp;gt;&amp;lt;/code&amp;gt;: Write a savegame to &amp;lt;filename&amp;gt;. The file is placed in the &#039;Saves&#039; folder and the &#039;.ssf&#039; extension is automatically added. If -y is given the file is overwritten if it already exists. Filename cannot have spaces.&lt;br /&gt;
* &amp;lt;code&amp;gt;/savegame&amp;lt;/code&amp;gt;: Write a savegame to &#039;Saves/QuickSave.ssf&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;/reloadgame&amp;lt;/code&amp;gt;: Reload the savegame that was loaded when the engine was started. Useful for testing. Note that no cleanup is performed by the engine; i.e. Lua code should erase all units from the battlefield.&lt;br /&gt;
&lt;br /&gt;
== Lua API documentation ==&lt;br /&gt;
&lt;br /&gt;
Lua save/load brings two new call-ins:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;&#039;&#039;&#039;Load&#039;&#039;&#039; ( zip ) -&amp;gt; nil&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This &#039;&#039;&#039;SYNCED&#039;&#039;&#039; call-in is called after GamePreload and before GameStart. The single argument is a userdatum respresenting a zip file from which the game is being loaded.&lt;br /&gt;
&lt;br /&gt;
On this userdatum the following methods are defined:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:open(filename)&amp;lt;/code&amp;gt;: Opens a file within the zip file. Next calls to &amp;lt;code&amp;gt;zip:read&amp;lt;/code&amp;gt; will read from this file.&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:read(...)&amp;lt;/code&amp;gt;: Reads data from the file that is currently open. Arguments and return values are similar to [http://www.lua.org/pil/21.1.html io.read], although only &amp;quot;*all&amp;quot; and &#039;&#039;num&#039;&#039; are supported. The special case io.read(0) should work.&lt;br /&gt;
&lt;br /&gt;
Note that currently loading multiplayer games is not supported: the Load call-in is only called on the client loading the game.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;&#039;&#039;&#039;Save&#039;&#039;&#039; ( zip ) -&amp;gt; nil&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This &#039;&#039;&#039;UNSYNCED&#039;&#039;&#039; call-in is 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.&lt;br /&gt;
&lt;br /&gt;
On this userdatum the following methods are defined:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:open(filename)&amp;lt;/code&amp;gt;: Opens a new file within the zip file. Next calls to &amp;lt;code&amp;gt;zip:write&amp;lt;/code&amp;gt; will write to this file.&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:write(...)&amp;lt;/code&amp;gt;: Writes data to the file that is currently open. Arguments are same as [http://www.lua.org/pil/21.1.html io.write].&lt;br /&gt;
&lt;br /&gt;
Usually when this call-in is called you&#039;d do something like this (pseudocode) in one savegame gadget:&lt;br /&gt;
&lt;br /&gt;
  function gadget:Save(zip)&lt;br /&gt;
    zip:open(&amp;quot;units.lua&amp;quot;)&lt;br /&gt;
    for each unit do&lt;br /&gt;
      write some properties about the unit in zip, e.g. position, heading, health&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Note that Spring writes files into this zip file too. Any files in the directory &#039;Spring&#039; are reserved for use by the engine.&lt;br /&gt;
&lt;br /&gt;
== Example gadgets ==&lt;br /&gt;
* Zero-K: [https://github.com/ZeroK-RTS/Zero-K/blob/master/LuaRules/Gadgets/api_saveload.lua api_saveload.lua]&lt;br /&gt;
** For an example of a gadget that interacts with this API gadget, see [https://github.com/ZeroK-RTS/Zero-K/blob/master/LuaRules/Gadgets/start_unit_setup.lua start_unit_setup.lua]&lt;br /&gt;
If you have made a gadget that implements this interface, please add a link.&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Ren%27Py&amp;diff=15920</id>
		<title>Ren&#039;Py</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Ren%27Py&amp;diff=15920"/>
		<updated>2015-03-28T08:28:33Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Moved to Github&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Ren&#039;Py&#039;&#039;&#039; is an open source visual novel engine, available [http://www.renpy.org/ here]. It can be used in conjunction with Spring to provide a singleplayer experience with narrative, dialogue, images and videos.&lt;br /&gt;
&lt;br /&gt;
== Using Ren&#039;Py with Spring ==&lt;br /&gt;
Without the use of sockets, Ren&#039;Py and Spring can best communicate in the following way:&lt;br /&gt;
&lt;br /&gt;
=== Ren&#039;Py to Spring ===&lt;br /&gt;
Python can read a Spring startscript and modify it, say using [http://docs.python.org/2/library/string.html#formatstrings str.format] or the older [http://docs.python.org/2/library/stdtypes.html#string-formatting % (modulo) operator]. In this way, any arbitrary game, per-player or per-team information can be made available to Spring at runtime. It is also theoretically possible for Python to modify the contents of an .sdz or .sdd archive directly, but this is not recommended.&lt;br /&gt;
&lt;br /&gt;
=== Spring to Ren&#039;Py ===&lt;br /&gt;
A widget or gadget can write a Python file with any information to be communicated to Ren&#039;Py, which it can then import using the [http://docs.python.org/2/library/functions.html#execfile execfile] function. Bear in mind that because Spring is limited in which directories its Lua can write files to, Ren&#039;Py will need to know where the Spring datadir is.&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
[https://github.com/KingRaptor/springpy SpringPy] is a code example for Spring-Ren&#039;Py communication. You can check out the whole repo and open/run the Ren&#039;Py project with the Ren&#039;Py SDK.&lt;br /&gt;
* [https://github.com/KingRaptor/springpy/blob/master/game/script.rpy Example script.rpy]&lt;br /&gt;
* [https://github.com/KingRaptor/springpy/blob/master/spring/script_pytest.txt Example startscript]&lt;br /&gt;
* [https://github.com/KingRaptor/springpy/blob/master/spring/LuaUI/Widgets/api_shared_functions.lua Widget to write Python dictionaries and module files]&lt;br /&gt;
* [https://github.com/KingRaptor/springpy/blob/master/spring/LuaUI/Widgets/dbg_test.lua Test widget]: writes data required by sample code on widget:Initialize()&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Dev]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:PublicRepos&amp;diff=8349</id>
		<title>Gamedev:PublicRepos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:PublicRepos&amp;diff=8349"/>
		<updated>2015-03-28T08:26:38Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Air Raid moved to Github&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What Is This?==&lt;br /&gt;
This is a small collection of publicly known and readable code repositories for established Spring games. The intention being to provide a wealth of examples to all game developers from noob to pro.&lt;br /&gt;
&lt;br /&gt;
== Known Repos ==&lt;br /&gt;
[https://github.com/KingRaptor/air-raid-spring Air Raid]&lt;br /&gt;
&lt;br /&gt;
[http://imolarpg.dyndns.org/trac/balatest/browser/trunk/ Balanced Annihilation]&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/basically-ota/ BOTA]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/conflictterra/source/browse/#svn%2Fgames%2FCT Conflict Terra]&lt;br /&gt;
&lt;br /&gt;
[http://www.petro.darkstars.co.uk/damned/ Damned]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/EvolutionRTS/Evolution-RTS Evolution RTS]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/imperialwinter/swiw.sdd Imperial Winter]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/journeywar/ Journeywar]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/jk3064?tab=repositories jK]&lt;br /&gt;
* [[Chili]]&lt;br /&gt;
* [[LUPS]]&lt;br /&gt;
* Custom-Unit-Shader-Framework&lt;br /&gt;
* [[Mapdev:Main#Blueprint | Map-Blueprint]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/David-Becker/mods KDR_11k] &lt;br /&gt;
* Cuberors&#039; Finest&lt;br /&gt;
* CvC&lt;br /&gt;
* Doserz&lt;br /&gt;
* Fibre&lt;br /&gt;
* GINTA&lt;br /&gt;
* Gun Wings Test&lt;br /&gt;
* Light Side of Spring&lt;br /&gt;
* MicroModules&lt;br /&gt;
* Pong&lt;br /&gt;
&lt;br /&gt;
[https://sourceforge.net/p/mwspring/code/ MechCommander: Legacy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/spring1944/spring1944 Spring: 1944]&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/springtanks/source/browse/#svn%2Ftrunk Spring Tanks]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/springtutorialgame/source/browse/#svn%2Ftrunk%2FSpringTutorialGame.sdd Spring Tutorial Game]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KingRaptor/THIS THIS]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/xta-springrts/ XTA]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ZeroK-RTS/Zero-K/ Zero-K]&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Dev]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12016</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=12016"/>
		<updated>2014-08-27T11:58:50Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* Unit Informations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(those special TeamIDs are not supported by all functions)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALL_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.MY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALLY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ENEMY_UNITS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGaiaTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGodModeEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsCheatingEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsDevLuaEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsEditDefsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.AreHelperAIsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FixedAllies&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGameOver&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Those functions allow to save data per Game,Team and Unit.&amp;lt;br&amp;gt;The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;string values are new since 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRulesInfoMap&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;REMOVED in 0.82!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; { [key1] = string value1, [key2] = string value2, ... }&lt;br /&gt;
  ( string &amp;quot;key&amp;quot; ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number ruleIndex | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number | string value1}, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number index | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number | string value1}, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number index | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number | string value1}, ... }&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! bool values are not transfered from C to Lua correctly, so in IF theres needed to use this condition:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&amp;quot;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
not only:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;quot;if (Spring.GetModOptions.exampleOption) then...end&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number frameNum%dayFrames, number frameNum/dayFrames&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWind&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number dirX, number dirY, number dirZ, &lt;br /&gt;
         number strength,  number normDirX, number normDirY, number normDirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHeadingFromVector&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVectorFromHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number heading ) -&amp;gt; number x, number z&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSideData&#039;&#039;&#039;&lt;br /&gt;
  ( string sideName ) -&amp;gt; nil | string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( number sideID ) -&amp;gt; nil | string sideName, string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( ) -&amp;gt; { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamStartBox&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID ) -&amp;gt; nil | number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerList&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])&lt;br /&gt;
  -&amp;gt; nil | { [1] = number playerID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1] ) -&amp;gt; nil | { [1] = number teamID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number allyTeamID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; &lt;br /&gt;
    nil | string  &amp;quot;name&amp;quot;,  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(PRE-83.0: in synced code this is &amp;quot;SYNCED_NONAME&amp;quot;!)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean active,&lt;br /&gt;
          boolean spectator,&lt;br /&gt;
          number  teamID,&lt;br /&gt;
          number  allyTeamID,&lt;br /&gt;
          number  pingTime,&lt;br /&gt;
          number  cpuUsage,&lt;br /&gt;
          string  country,&lt;br /&gt;
          number  rank&lt;br /&gt;
          table   customPlayerKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerControlledUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAIInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; &lt;br /&gt;
          number  skirmishAIID,&lt;br /&gt;
          string  name,&lt;br /&gt;
          number  hostingPlayerID,&lt;br /&gt;
          string  shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          string  version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          table   options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number allyteamID ) -&amp;gt; nil | table   customTeamKeys&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number  teamID,&lt;br /&gt;
          number  leader, &amp;lt;span class=note&amp;gt;(:= a player id)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean isDead,&lt;br /&gt;
          boolean isAiTeam,&lt;br /&gt;
          string  &amp;quot;side&amp;quot;,&lt;br /&gt;
          number  allyTeam,&lt;br /&gt;
          table   customTeamKeys,&lt;br /&gt;
          number  incomeMultiplier&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResources&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number currentLevel,&lt;br /&gt;
          number storage,&lt;br /&gt;
          number pull,&lt;br /&gt;
          number income,&lt;br /&gt;
          number expense,&lt;br /&gt;
          number share,&lt;br /&gt;
          number sent,&lt;br /&gt;
          number received&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitStats&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number killed,&lt;br /&gt;
          number died,&lt;br /&gt;
          number capturedBy,&lt;br /&gt;
          number capturedFrom,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResourceStats&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID,  string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number used,&lt;br /&gt;
          number produced,&lt;br /&gt;
          number excessed,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStatsHistory&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID [, number startIndex [, number endIndex = startIndex ]]) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number cur_max_index |&lt;br /&gt;
    {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamLuaAI&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; string &amp;quot;luaAI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, so maybe depends, but in my LuaAI.lua name is on first position...&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&#039;&#039;&#039;Spring.AreTeamsAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID1, number teamID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ArePlayersAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID1, number playerID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil |&lt;br /&gt;
    unitDefTable = {&lt;br /&gt;
      [number unitDefID] = { [1] = [number unitID], etc... },&lt;br /&gt;
      etc...&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | countTable = { [number unitDefID] = count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsByDefs&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID | { number unitDefID1, ... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitDefCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID ) -&amp;gt; nil | number count&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) &lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInBox&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number ymin, number zmin,&lt;br /&gt;
    number xmax, number ymax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInPlanes&#039;&#039;&#039;&lt;br /&gt;
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  plane normals point towards accepted space,&lt;br /&gt;
  so the acceptance criteria for each plane is:&lt;br /&gt;
    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestAlly&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range ] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestEnemy&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range [, bool useLOS]] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&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.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBlocking&#039;&#039;&#039; {{new|85.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean blocking, boolean crushable&lt;br /&gt;
{{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;airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil | 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;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(returns the distance of 2 units)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D ] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.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&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;
&#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; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.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 ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{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.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;
&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.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;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SaveLoad&amp;diff=11570</id>
		<title>Lua SaveLoad</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SaveLoad&amp;diff=11570"/>
		<updated>2014-07-28T06:09:03Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* Example gadgets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Lua Save/Load support =&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Engine save/load has been broken/unstable for a very long time. I believe the major reasons for this were:&lt;br /&gt;
&lt;br /&gt;
* In particular for loading too much special code paths were traversed, that were not used for anything else (e.g. creg_Serialize and creg_PostLoad functions in many classes);&lt;br /&gt;
* Each class was responsible for it&#039;s own saving and loading;&lt;br /&gt;
* The code for loading was spread out over many classes;&lt;br /&gt;
* Save/load using CREG was extremely slow.&lt;br /&gt;
* Savegames created using CREG were bound to be incompatible between different Spring versions because they relied inherently on the implementation details of every single class involved;&lt;br /&gt;
* The save/load system strived to be 100% perfect, saving every single detail.&lt;br /&gt;
* No clear way to save Lua states (without making Lua aware of it)&lt;br /&gt;
&lt;br /&gt;
I realised we have a pretty decent and reasonably stable Lua interface. So why use this for save/load:&lt;br /&gt;
&lt;br /&gt;
* The code has been tested in practice (it&#039;s used in widgets and gadgets);&lt;br /&gt;
* The interface is reasonably stable, so savegames can be compatible between different Spring versions;&lt;br /&gt;
* Not a single class needs special support for save/load, as save/load uses existing APIs.&lt;br /&gt;
* By simply using the standard call-in mechanism any gadgets can save some state if that is desired. The save/load gadget does not need to get special treatment at all.&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=23&amp;amp;t=21805 Argh] and [http://springrts.com/phpbb/viewtopic.php?f=23&amp;amp;t=21836 zwzsg] had this idea too and implement save/load using Lua only. This is a little bit hacky and it is slow when saving large amounts of data such as e.g. the modified terrain heightmap.&lt;br /&gt;
&lt;br /&gt;
Hence Lua save/load brings engine support for Lua save/load :-)&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
&lt;br /&gt;
Instead of having the engine be responsible for serializing every bit of gamestate to disk, Lua save/load transfers most of the responsibility to the game (developer). The game developer can decide what objects and what properties are important to save, and ultimately a gadget could be created that could be drag &#039;n dropped in nearly any game. (Argh&#039;s and zwzsg&#039;s code would be useful for this.)&lt;br /&gt;
&lt;br /&gt;
There are two new call-ins: Load and Save, that allow a Lua save/load system to seamlessly integrate with other interfaces of the engine (e.g. commandline, lobby). Load is called by the engine if it has been instructed to load a game. Save is called by the engine whenever the chat command &#039;/save &amp;lt;filename&amp;gt;&#039; or &#039;/savegame&#039; is given. Both get a userdatum as argument. Using the methods open, read and write on this userdatum the Lua code can read/write chunks of data.&lt;br /&gt;
&lt;br /&gt;
At this moment existing code for reading and writing zip files has been re-used for Lua save/load, so savegames are simply renamed zip files (.ssf)&lt;br /&gt;
&lt;br /&gt;
== Chat commands ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/save [-y] &amp;lt;filename&amp;gt;&amp;lt;/code&amp;gt;: Write a savegame to &amp;lt;filename&amp;gt;. The file is placed in the &#039;Saves&#039; folder and the &#039;.ssf&#039; extension is automatically added. If -y is given the file is overwritten if it already exists.&lt;br /&gt;
* &amp;lt;code&amp;gt;/savegame&amp;lt;/code&amp;gt;: Write a savegame to &#039;Saves/QuickSave.ssf&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;/reloadgame&amp;lt;/code&amp;gt;: Reload the savegame that was loaded when the engine was started. Useful for testing. Note that no cleanup is performed by the engine; i.e. Lua code should erase all units from the battlefield.&lt;br /&gt;
&lt;br /&gt;
== Lua API documentation ==&lt;br /&gt;
&lt;br /&gt;
Lua save/load brings two new call-ins:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;&#039;&#039;&#039;Load&#039;&#039;&#039; ( zip ) -&amp;gt; nil&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This &#039;&#039;&#039;SYNCED&#039;&#039;&#039; call-in is called after GamePreload and before GameStart. The single argument is a userdatum respresenting a zip file from which the game is being loaded.&lt;br /&gt;
&lt;br /&gt;
On this userdatum the following methods are defined:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:open(filename)&amp;lt;/code&amp;gt;: Opens a file within the zip file. Next calls to &amp;lt;code&amp;gt;zip:read&amp;lt;/code&amp;gt; will read from this file.&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:read(...)&amp;lt;/code&amp;gt;: Reads data from the file that is currently open. Arguments and return values are similar to [http://www.lua.org/pil/21.1.html io.read], although only &amp;quot;*all&amp;quot; and &#039;&#039;num&#039;&#039; are supported. The special case io.read(0) should work.&lt;br /&gt;
&lt;br /&gt;
Note that currently loading multiplayer games is not supported: the Load call-in is only called on the client loading the game.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;&#039;&#039;&#039;Save&#039;&#039;&#039; ( zip ) -&amp;gt; nil&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This &#039;&#039;&#039;UNSYNCED&#039;&#039;&#039; call-in is 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.&lt;br /&gt;
&lt;br /&gt;
On this userdatum the following methods are defined:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:open(filename)&amp;lt;/code&amp;gt;: Opens a new file within the zip file. Next calls to &amp;lt;code&amp;gt;zip:write&amp;lt;/code&amp;gt; will write to this file.&lt;br /&gt;
* &amp;lt;code&amp;gt;zip:write(...)&amp;lt;/code&amp;gt;: Writes data to the file that is currently open. Arguments are same as [http://www.lua.org/pil/21.1.html io.write].&lt;br /&gt;
&lt;br /&gt;
Usually when this call-in is called you&#039;d do something like this (pseudocode) in one savegame gadget:&lt;br /&gt;
&lt;br /&gt;
  function gadget:Save(zip)&lt;br /&gt;
    zip:open(&amp;quot;units.lua&amp;quot;)&lt;br /&gt;
    for each unit do&lt;br /&gt;
      write some properties about the unit in zip, e.g. position, heading, health&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Note that Spring writes files into this zip file too. Any files in the directory &#039;Spring&#039; are reserved for use by the engine.&lt;br /&gt;
&lt;br /&gt;
== Example gadgets ==&lt;br /&gt;
* Zero-K: [https://github.com/KingRaptor/Zero-K/blob/master/LuaRules/Gadgets/api_saveload.lua api_saveload.lua]&lt;br /&gt;
** For an example of a gadget that interacts with this API gadget, see [https://github.com/KingRaptor/Zero-K/blob/master/LuaRules/Gadgets/start_unit_setup.lua start_unit_setup.lua]&lt;br /&gt;
If you have made a gadget that implements this interface, please add a link.&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11041</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11041"/>
		<updated>2014-04-20T11:47:36Z</updated>

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

		<summary type="html">&lt;p&gt;Kingraptor: /* Lobby client development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
&lt;br /&gt;
==Protocol==&lt;br /&gt;
* [http://springrts.com/dl/LobbyProtocol/ HTML] (is updated once a day)&lt;br /&gt;
* [https://github.com/spring/LobbyProtocol/blob/master/ProtocolDescription.xml XML] (raw, always latest)&lt;br /&gt;
&lt;br /&gt;
==Download Systems==&lt;br /&gt;
* [http://springrts.com/wiki/Dev:LobbyDownloadSystems Lobby Download Systems]&lt;br /&gt;
&lt;br /&gt;
=Lobby client development=&lt;br /&gt;
&lt;br /&gt;
==Useable lobby clients==&lt;br /&gt;
&lt;br /&gt;
===SpringLobby===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;BrainDamage&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;koshi&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SpringLobby is the official lobby client of spring and is bundled with the Spring engine in the installer. It uses the &#039;&#039;wxWidgets&#039;&#039; library. You can browse the sources and submit issues on its [http://springlobby.info/ website].&lt;br /&gt;
&lt;br /&gt;
===Zero-K Lobby===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows/Linux&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C#&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Licho&amp;lt;/font&amp;gt; &amp;amp; &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;quantum&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/zero-k/ Zero-K project page]&lt;br /&gt;
&lt;br /&gt;
===TASClient===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Delphi&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Satirik&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download the sources from the [http://springrts.com/svn/spring/Lobby/TASClient/ subversion repository] (svn://springrts.com/svn/spring/Lobby/TASClient/) and browse them on the [http://springrts.com/websvn/listing.php?repname=Spring&amp;amp;path=%2FLobby%2FTASClient%2F#_Lobby_TASClient_ websvn]. Latest binary version is always available here:&lt;br /&gt;
http://springrts.com/dl/tasclient/TASClientLatest.7z&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18999 How to compile TASClient]&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=19014 How to customize TASClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===flobby===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Linux&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;cleanrock&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/cleanrock/flobby github page]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Weblobby===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Java&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;CarRepairer&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://weblobby.springrts.com weblobby.springrts.com]&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/springweblobby/ project site]&lt;br /&gt;
&lt;br /&gt;
==Work in progress or abandoned==&lt;br /&gt;
&lt;br /&gt;
===Alphalobby===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alphalobby is still very much work in progress. If you still wish to use it, source available from the [http://code.google.com/p/alphalobby/source/checkout mercurial repository], binary available on the [http://springfiles.com/spring/lobby-clients/alphalobby springfiles page].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CheeseLobby===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Java&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Cheesecan&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=64&amp;amp;t=24905 forum thread]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/jahwag/cheeselobby binaries and code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===QtLobby===&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tizbac/qtlobby project page]&lt;br /&gt;
&lt;br /&gt;
=Libraries and frameworks=&lt;br /&gt;
&lt;br /&gt;
==Spring-PythonBotFramework==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;, by&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;BrainDamage&amp;lt;/font&amp;gt; &amp;amp; &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;koshi&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A bot framework written in python. [https://github.com/renemilk/tasbot/wiki GitHub wiki]&lt;br /&gt;
&lt;br /&gt;
==Go SpringLobbyClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Go&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple client implementation of the lobby protocol in Go.&lt;br /&gt;
[https://github.com/Agon/go-slc/ project page]&lt;br /&gt;
&lt;br /&gt;
=Lobby server development=&lt;br /&gt;
&lt;br /&gt;
==SpringLS==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Java&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;hoijui&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The longest-running lobby server, created by Betalord. You can fetch the sources through &#039;&#039;git&#039;&#039;. Details can be found on the [http://github.com/spring/SpringLS development site].&lt;br /&gt;
&lt;br /&gt;
==UberServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;aegis&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The primary lobby server currently running on springrts.com. All protocol commands in the primary documentation should be fully-functional and compatible between both uberserver and SpringLS. See the dedicated [[uberserver]] for mor info.&lt;br /&gt;
&lt;br /&gt;
[[Category: Lobby]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Changelog&amp;diff=4047</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Changelog&amp;diff=4047"/>
		<updated>2013-11-08T12:50:45Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: fix mass bolding&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=95.0=&lt;br /&gt;
&lt;br /&gt;
==Major==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; new datadir structure: http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=30044 &amp;amp; http://springrts.com/dl/buildbot/default/master/95.0/manpages/spring.6.html&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; new LuaIntro (Lua based loadscreen with examples)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add map border rendering (+ /mapborder command)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; bugfixes &amp;amp; speedups&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove support for SM3 maps&amp;lt;br&amp;gt;(but fix #3942 so SM3 is left in a slightly less broken state for whoever wants to mess with it in the future)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
*&amp;lt;span&amp;gt; use SSE in some matrix math&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; save a little mem in Pathfinder&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduce PFS update rate by 10%&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; little speedup in Grass rendering (it&#039;s still slow on some maps)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use 32bit shadowmap. ~7% faster than 24bit one, cause of better alignment&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; move Lua GC to its own callin; fixes bug where GC was too slow to catch up and ate &amp;gt;&amp;gt;100MB ram&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; nihiliate MiniMap usage by rendering it to a texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; PathEstimator: add unsynced caches (*might* help in big AI games)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ExplosionGenerator:&amp;lt;br&amp;gt;pre-load all static (weapon/model/piece) CEG&#039;s and&amp;lt;br&amp;gt;never do lazy script-parsing anymore where possible&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;(only CEG&#039;s delay-spawned by other CEG&#039;s are still&amp;lt;br&amp;gt;loaded this way, rest can be dynamically reloaded)&lt;br /&gt;
*&amp;lt;span&amp;gt; PFS: prevent special-case search expansion when unit is close to goal but goal is blocked&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make FeatureHandler::AllocateNewFeatureIDs more efficient in case of feature spam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
*&amp;lt;span&amp;gt; force-align all thread entry points so SSE functions don&#039;t crash (on win32)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow Lua AI&#039;s to be selected from the menu&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; removed &amp;quot;mods&amp;quot; from archive scandirs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; converted RotateLogFiles to a bool var (defaults to false)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove &amp;quot;--projectiledump&amp;quot; and add &amp;quot;--list-ceg-classes&amp;quot; (converted to JSON format )&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not switch camera-mode on countdown&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; colorized stdout (you can use `spring --nocolor` &amp;amp; SPRING_NOCOLOR envvar to disable)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; show LuaMemUsage in /debug view&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; load only image formats which work on all platforms, current supported image formats are:&amp;lt;br&amp;gt;PNG, JPG, TGA, DDS, BMP&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove engine support for gamedata/messages.tdf,&amp;lt;br&amp;gt;see examples/Widgets/game_messages.lua for a possible replacement&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more verbose CEG parsing (warns now about unknown tags)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; switch to a high precision clock all over the engine (including Lua)&amp;lt;br&amp;gt;NOTE THAT THIS IS DISABLED BY DEFAULT ON WINDOWS BUILDS (cf. UseHighResTimer)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; copied a lot config descriptions from wiki to the engine (thx for all the wiki&#039;ers)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; http://springrts.com/wiki/Springsettings.cfg is now automatically updated with each release&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; disable build of spring-multithreaded (unmaintained / doesn&#039;t compile)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; disable luaThreadingModel &amp;gt; 2, can be overriden with EnableUnsafeAndBrokenMT=1&amp;lt;br&amp;gt;fixes #3774, #2884, #2784, #3673, #3808&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more verbosity for spring-dedicated on exit &amp;amp; demo-writing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add config &amp;quot;MenuArchive&amp;quot; to allow background image to be set which is read from the archive in the path bitmaps/ui/background/&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix /keydebug for release builds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; updated game_end example gadget to handle quit/resigns better, reacts faster, and better code&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GuiTraceRay does not stop at water surface anymore by default&amp;lt;br&amp;gt;(all ground-attack positions are adjusted in synced code now)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt;-&amp;gt; torpedo launchers cannot overshoot, etc.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GuiTraceRay now ignores noSelect units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SmoothCameraController: add SMOOTHing to alt+mousewheel zoom&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; change WorldObject::speed to a float4, store magnitude in .w&amp;lt;br&amp;gt;(saves a number of unnecessary .Length() calls here and there)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; PathCache: track maximum size + double initial capacity, register hash collisions and switch hash function&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GameServer: add config-option ServerRecordDemos&amp;lt;br&amp;gt;non-dedicated servers (eg. headless builds used as &amp;quot;dedicated&amp;quot; standin) can now record games if desired&amp;lt;br&amp;gt;ACHTUNG: server demos are now stored in a separate directory &amp;quot;demos-server/&amp;quot; to prevent name conflicts!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AssParser:&amp;lt;br&amp;gt;generalize logic for multiple UV channels&amp;lt;br&amp;gt;fix major issue with baked transforms&amp;lt;br&amp;gt;restrict support to well-known &amp;amp; -maintained formats (.3DS, .DAE, .LWO, .BLEND)&amp;lt;br&amp;gt;allow modellers to work around #3552 by recognizing a number of new piece-table keys&amp;lt;br&amp;gt;for the root piece:&amp;lt;br&amp;gt;&amp;quot;xaxis&amp;quot; = float3, &amp;quot;yaxis&amp;quot; = float3, &amp;quot;zaxis&amp;quot; = float3 (determine global orientation of model)&amp;lt;br&amp;gt;for all pieces:&amp;lt;br&amp;gt;&amp;quot;rotAxisSigns&amp;quot; = float3 (determines direction of script-applied rotations around each axis)&amp;lt;br&amp;gt;&amp;quot;rotAxisMap&amp;quot; = number (currently can only be 0=XYZ or 3=XZY, determines coordinate conversion)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; SpringApp:&amp;lt;br&amp;gt;fix old bug in fullscreen&amp;amp;&amp;amp;dualscreen mode cutting window-size in half on each SDL_VIDEOEXPOSE event&amp;lt;br&amp;gt;refactor to allow choice of (win32) timer via cmdline&amp;amp;config&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SpringTime:&amp;lt;br&amp;gt;switch to native win32 clock (same as used by SDL) on windows&amp;lt;br&amp;gt;select win32 clock based on config&amp;amp;cmdline-parameter &#039;useHighResTimer&#039;&amp;lt;br&amp;gt;remove the last SDL_GetTicks dependencies&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sim==&lt;br /&gt;
*&amp;lt;span&amp;gt; reduce target-lost CAI timeout from 8 to 2 seconds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make calls to script-&amp;gt;{Start, Stop}Moving more consistent: only run them&amp;lt;br&amp;gt;when a unit transitions from zero to non-zero speed or vice versa, and no&amp;lt;br&amp;gt;longer do so during in-place rotations --&amp;gt; animations should no longer be&amp;lt;br&amp;gt;interrupted / reset&amp;lt;br&amp;gt;THIS APPLIES TO ALL UNIT TYPES (AIR AND GROUND), TEST YOUR SCRIPTS&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove TA-specific code in CobInstance::Create&amp;lt;br&amp;gt;(this changes the argument value to COB&#039;s SetMaxReloadTime for&amp;lt;br&amp;gt;units equipped with BeamLasers and / or more than one weapon)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; {Laser, Emg}Projectile: disable all collision-testing when ttl &amp;lt;= 0&amp;lt;br&amp;gt;these projectile types could exceed their range due to fadeout&amp;lt;br&amp;gt;and only removed themselves (deleteMe=true) when intensity or&amp;lt;br&amp;gt;length reached 0, so without disabling coldet (checkCol=false)&amp;lt;br&amp;gt;range-exploits were possible&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove impulse &amp;quot;capacitance&amp;quot; from ground units (SolidObject::residualImpulse and ::StoreImpulse())&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; apply UnitDef::myGravity to ground units (if non-zero)&amp;lt;br&amp;gt;NOTE: myGravity acts as a map-gravity MULTIPLIER for aircraft; it REPLACES map gravity for land-based units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; steering/avoidance: actively avoid only mobile units, let PFS/CD handle statics&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; SolidObject:&amp;lt;br&amp;gt;cleanup internal physical/collision state management&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;model physical drag, use it for features and skidding units&lt;br /&gt;
==&amp;lt;br&amp;gt;related to the change above Spring.Set*Physics now takes three extra number&amp;lt;br&amp;gt;arguments (Set*Physics(..., number drag.x, number drag.y, number drag.z))&amp;lt;br&amp;gt;to control how much an object is affected by drag forces==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Feature: set default impulseMult to 0 for &#039;immobile&#039; / static wreckage (cf. new FeaturePreDamaged)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unit: transfer impulse to transporter if being transported&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unit: swap order of UnitPreDamaged and HitByWeapon callins (viewtopic.php?f=23&amp;amp;t=30879)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; *Weapon: fix minor targeting issues due to new SolidObject underwater state definition&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LaserCannon: calculate projectile ttl from weapon range, not weapondef range&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; BombDropper:&amp;lt;br&amp;gt;*always* drop bombs/torpedoes in time to hit target&amp;lt;br&amp;gt;(even if the distance from weapon to target still exceeds static&amp;lt;br&amp;gt;range, range is not meaningful for these weapons anyway since it&amp;lt;br&amp;gt;depends on launching unit&#039;s velocity, altitude and gravity)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; BeamLaser: fully reimplement the sweepfire logic&amp;lt;br&amp;gt;still has no script interaction so use with care&amp;lt;br&amp;gt;(respects reloadtime constraint but not much else)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; UnitDef:&amp;lt;br&amp;gt;read brakeRate for aircraft without scaling by 0.1 and make brakeRate&amp;lt;br&amp;gt;default to maxAcc, not maxAcc * 3.0 (--&amp;gt; open up your unitdef_post&#039;s)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; WeaponDef: silently ignore bad slavedTo indices&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MoveDef:&amp;lt;br&amp;gt;remove old naming-scheme restrictions (which required names to contain &amp;quot;tank&amp;quot;, etc)&amp;lt;br&amp;gt;instead parse key &amp;quot;speedModClass&amp;quot; with accepted values 0=Tank, 1=KBot, 2=Hover, 3=Ship&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;fix insane default value for heatMod parameter (since 7bef7760f4)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; MoveType: fix LOS emit-heights for floating units being relative to ocean floor&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAirMoveType: do not use fuel while being refueled (yo dawg...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; StrafeAirMoveType: overshoot less when landing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; HoverAirMoveType:&amp;lt;br&amp;gt;remove support for reading (and assigning to) key &amp;quot;brakeDistance&amp;quot;&amp;lt;br&amp;gt;via MoveCtrl; this quantity is now calculated dynamically based&amp;lt;br&amp;gt;on speed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GroundMoveType:&amp;lt;br&amp;gt;add missing TestMoveSquare checks in places where units are repositioned by coldet&amp;lt;br&amp;gt;fix minor bug in GetGroundHeight (caused hovercraft to vibrate in shallow water)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; remove ancient &amp;quot;move transportee 1000 elmos under the map to hide it when attaching to piece -1&amp;quot; hack&amp;lt;br&amp;gt;there is now a &amp;quot;void&amp;quot; state for such purposes; objects (units and features) in this state will never&amp;lt;br&amp;gt;1) take damage, even from Lua (but can be killed by Lua)&amp;lt;br&amp;gt;2) be rendered through any engine path (nor their icons)&amp;lt;br&amp;gt;3) be intersectable by either synced or unsynced rays&amp;lt;br&amp;gt;4) block any other objects from existing on top of them&amp;lt;br&amp;gt;5) be selectable&amp;lt;/span&amp;gt;&lt;br /&gt;
:::    &lt;br /&gt;
*&amp;lt;span&amp;gt; hovercraft now take water damage by default&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LuaUnitDefs: deprecate the &amp;quot;drag&amp;quot; key, was an internal variable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaUnitDefs:&amp;lt;br&amp;gt;add more is* functions for all unit-types known to Spring&amp;lt;br&amp;gt;the complete function list as of 95.0 is:&amp;lt;br&amp;gt;isTransport&amp;lt;br&amp;gt;isImmobile&amp;lt;br&amp;gt;isBuilding&amp;lt;br&amp;gt;isBuilder&amp;lt;br&amp;gt;isMobileBuilder&amp;lt;br&amp;gt;isStaticBuilder&amp;lt;br&amp;gt;isFactory&amp;lt;br&amp;gt;isExtractor&amp;lt;br&amp;gt;isGroundUnit&amp;lt;br&amp;gt;isAirUnit&amp;lt;br&amp;gt;isStrafingAirUnit&amp;lt;br&amp;gt;isHoveringAirUnit&amp;lt;br&amp;gt;isFighterAirUnit&amp;lt;br&amp;gt;isBomberAirUnit&amp;lt;br&amp;gt;fully deprecate the following UnitDef keys:&amp;lt;br&amp;gt;after 95.0 these will all become nil, beware&amp;lt;br&amp;gt;.builder&amp;lt;br&amp;gt;.floater&amp;lt;br&amp;gt;.canDGun&amp;lt;br&amp;gt;.canCrash&amp;lt;br&amp;gt;.isCommander&amp;lt;br&amp;gt;.moveData&amp;lt;br&amp;gt;.type&amp;lt;br&amp;gt;.maxSlope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LuaUnitDefs: deprecate canHover (check moveDef.family instead to determine if a unit is a hovercraft)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaUnitDefs: log error when explodeAs &amp;amp; selfDestructAs are missing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaUnitScript: optionally make Turn and Move insta-update piece matrices (pass &amp;quot;true&amp;quot; as the fifth argument)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaRules:&amp;lt;br&amp;gt;setup &amp;quot;proper&amp;quot; (transformation) state for the DrawProjectile callin&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;add callin AllowWeaponInterceptTarget(number interceptorUnitID, number interceptorWeaponID, number targetProjectileID) --&amp;gt; boolean&amp;lt;br&amp;gt;add callins FeatureDamaged and FeaturePreDamaged&amp;lt;br&amp;gt;FeatureDamaged(&amp;lt;br&amp;gt;number featureID, number featureDefID, number featureTeam,&amp;lt;br&amp;gt;number damage&amp;lt;br&amp;gt;[, number weaponDefID, number projectileID&amp;lt;br&amp;gt;[, number attackerID, number attackerDefID, number attackerTeam ]]&amp;lt;br&amp;gt;)&amp;lt;br&amp;gt;FeaturePreDamaged(&amp;lt;br&amp;gt;number featureID, number featureDefID, number featureTeam,&amp;lt;br&amp;gt;number damage&amp;lt;br&amp;gt;[, number weaponDefID, number projectileID&amp;lt;br&amp;gt;[, number attackerID, number attackerDefID, number attackerTeam ]]&amp;lt;br&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LuaSynced*: make sure ALL weapon API functions are 1-based&amp;lt;br&amp;gt;UPDATE YOUR GAME&#039;S UNIT_SCRIPT.LUA IF IT HAS LUA-SCRIPTED&amp;lt;br&amp;gt;UNITS AND YOU ARE NOT USING SPRING&#039;S (BASECONTENT) VERSION&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LuaSynced*: make {S,G}et{Unit,Feature}Blocking signatures match&amp;lt;br&amp;gt;Get{Unit,Feature}Blocking(number objectID) --&amp;gt;&amp;lt;br&amp;gt;boolean isBlocking,&amp;lt;br&amp;gt;boolean isSolidObjectCollidable,&amp;lt;br&amp;gt;boolean isProjectileCollidable,&amp;lt;br&amp;gt;boolean isRaySegmentCollidable,&amp;lt;br&amp;gt;boolean crushable,&amp;lt;br&amp;gt;boolean blockEnemyPushing,&amp;lt;br&amp;gt;boolean blockHeightChanges&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Set{Unit,Feature}Blocking(&amp;lt;br&amp;gt;number objectID,&amp;lt;br&amp;gt;boolean isBlocking,&amp;lt;br&amp;gt;boolean isSolidObjectCollidable&amp;lt;br&amp;gt;[, boolean isProjectileCollidable&amp;lt;br&amp;gt;[, boolean isRaySegmentCollidable&amp;lt;br&amp;gt;[, boolean crushable&amp;lt;br&amp;gt;[, boolean blockEnemyPushing&amp;lt;br&amp;gt;[, boolean blockHeightChanges ]]]]]&amp;lt;br&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LuaSynced*: slightly change {Get,Set}ProjectileTarget signatures&amp;lt;br&amp;gt;GetProjectileTarget now returns a number instead of a string to indicate target-type&amp;lt;br&amp;gt;GetProjectileTarget now always returns two arguments (if given projectileID is valid)&amp;lt;br&amp;gt;GetProjectileTarget now always returns a target position if projectile has no target object&amp;lt;br&amp;gt;SetProjectileTarget now takes a number instead of a string to indicate target-type&amp;lt;/span&amp;gt;&lt;br /&gt;
:::    &amp;lt;br&amp;gt;GetProjectileTarget(number projectileID) --&amp;gt; nil | [number targetType, number targetID | table targetPos = {[1] = x, ...}]&amp;lt;br&amp;gt;SetProjectileTarget(number projectileID, [number targetID [, number targetType]]  |  [number x, number y, number z]) --&amp;gt; nil | boolean&lt;br /&gt;
:::    &amp;lt;br&amp;gt;where targetType is one of {string.byte(&#039;g&#039;) = GROUND, string.byte(&#039;u&#039;) = UNIT, string.byte(&#039;f&#039;) = FEATURE, string.byte(&#039;p&#039;) = PROJECTILE}&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaSynced*:&amp;lt;br&amp;gt;add callout Spring.GetRadarErrorParams(number allyTeamID) --&amp;gt; nil | number allyteamErrorSize, number baseErrorSize, number baseErrorMult&amp;lt;br&amp;gt;add callout Spring.SetRadarErrorParams(number allyTeamID, number allyteamErrorSize [, number baseErrorSize [, number baseErrorMult ]]) --&amp;gt; nil&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;add callout Spring.SetUnitPosErrorParams(number unitID,&amp;lt;br&amp;gt;number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&amp;lt;br&amp;gt;number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z&amp;lt;br&amp;gt;[ , number nextPosErrorUpdate]) --&amp;gt; nil&amp;lt;br&amp;gt;add callout Spring.GetUnitPosErrorParams(number unitID) --&amp;gt; nil |&amp;lt;br&amp;gt;number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&amp;lt;br&amp;gt;number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&amp;lt;br&amp;gt;number nextPosErrorUpdate&lt;br /&gt;
&amp;lt;br&amp;gt;add callout Spring.SetFeatureBlocking(args = see SetUnitBlocking) --&amp;gt; boolean&amp;lt;br&amp;gt;add callout Spring.SetPieceProjectileParams(number projectileID,&amp;lt;br&amp;gt;[ number explosionFlags, [ number spinAngle, [ number spinSpeed,&amp;lt;br&amp;gt;[ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&amp;lt;br&amp;gt;deprecate the Spring.SetProjectileSpin* functions&amp;lt;br&amp;gt;add callout Spring.GetFeatureBlocking(number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&amp;lt;br&amp;gt;add third return-value to Spring.GetUnitBlocking (signature is the same as that of GetFeatureBlocking)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaSyncedCtrl:&amp;lt;br&amp;gt;add callout SetProjectileAlwaysVisible(number projectileID, boolean alwaysVisible) --&amp;gt; nil&amp;lt;br&amp;gt;add callouts SetFeatureVelocity and SetFeaturePhysics (these work like their SetUnit* counterparts, reference the wiki docs)&amp;lt;/span&amp;gt;&lt;br /&gt;
==&amp;lt;br&amp;gt;cleanup arg-parsing of Spring.SetUnitPieceCollisionVolumeData callout&amp;lt;br&amp;gt;new signature SetUnitPieceCollisionVolumeData(&amp;lt;br&amp;gt;number unitID,&amp;lt;br&amp;gt;number pieceIdx,&amp;lt;br&amp;gt;boolean enable,&amp;lt;br&amp;gt;number scales.x, number scales.y, number scales.z,&amp;lt;br&amp;gt;number offset.x, number offset.y, number offset.z&amp;lt;br&amp;gt;[, number volumeType [, number primaryAxis]]&amp;lt;br&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LuaSyncedRead: deprecate the Spring.GetProjectileSpin* functions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaSyncedRead:&amp;lt;br&amp;gt;add Spring.GetPieceProjectileParams(number projectileID) --&amp;gt;&amp;lt;br&amp;gt;number explosionFlags, number spinAngle, number spinSpeed,&amp;lt;br&amp;gt;number spinVector.x, number spinVector.y, number spinVector.z&amp;lt;br&amp;gt;add callout Spring.GetUnitWeaponCanFire(number unitID, number weaponNum) --&amp;gt; boolean&amp;lt;br&amp;gt;add callout Spring.GetFeatureVelocity(number featureID[, boolean norm]) --&amp;gt; nil | number vel.x, number vel.y, number vel.z[, number |vel|]   and   Spring.GetProjectileDirection(number projectileID) --&amp;gt; nil | number dir.x, number dir.y, number dir.z&amp;lt;br&amp;gt;add callout Spring.GetProjectileDefID(number projectileID) --&amp;gt; nil | number weaponDefID&amp;lt;br&amp;gt;using this to get a weaponDefID is HIGHLY preferred to indexing WeaponDefNames via GetProjectileName&amp;lt;br&amp;gt;add callout Spring.GetUnitRotation(number unitID) --&amp;gt; nil | number pitch, number yaw, number roll (WIP)&amp;lt;br&amp;gt;extend arguments to Spring.TestMoveOrder&amp;lt;br&amp;gt;old signature: TestMoveOrder(&amp;lt;br&amp;gt;number unitDefID,&amp;lt;br&amp;gt;number pos.x, number pos.y, number pos.z&amp;lt;br&amp;gt;) --&amp;gt; boolean&amp;lt;br&amp;gt;new signature: TestMoveOrder(&amp;lt;br&amp;gt;number unitDefID,&amp;lt;br&amp;gt;number pos.x, number pos.y, number pos.z&amp;lt;br&amp;gt;[, number dir.x&amp;lt;br&amp;gt;[, number dir.y&amp;lt;br&amp;gt;[, number dir.z&amp;lt;br&amp;gt;[, boolean testTerrain&amp;lt;br&amp;gt;[, boolean testObjects&amp;lt;br&amp;gt;[, boolean centerOnly ]]]]]]&amp;lt;br&amp;gt;) --&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;added GetUnitWeaponTarget(unitID, weaponID) -&amp;gt;&amp;lt;br&amp;gt;nil | number targetType [, bool isUserTarget, table targetPos = {x, y, z} | number targetID]&amp;lt;br&amp;gt;(returned number of args is always 3 if targetType != None)&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaUnsyncedRead:&amp;lt;br&amp;gt;add callout Spring.GetPixelDir(int x, int y) -&amp;gt; number dirx, number diry, number dirz&amp;lt;br&amp;gt;add callout Spring.GetVisibleProjectiles(&amp;lt;br&amp;gt;[   number allyTeamID = -1&amp;lt;br&amp;gt;[ , boolean addSyncedProjectiles = true&amp;lt;br&amp;gt;[ , boolean addWeaponProjectiles = true&amp;lt;br&amp;gt;[ , boolean addPieceProjectiles  = true ]]]]&amp;lt;br&amp;gt;) --&amp;gt; nil | {[1] = projectileID, ...}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; Spring.GetUnitNearestEnemy doesn&#039;t return neutral units anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.GetProjectileVelocity now returns (targetPos - startPos) for BeamLasers and other hitscan weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.Get{}Velocity: always return speed.w (it&#039;s free now)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.SpawnCEG: allow number (cegID) as first arg + return a second value (number cegID)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.GetLogSections() &amp;amp; Spring.SetLogSectionFilterLevel(string sectionName, string|number logLevel)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add new Game. constants: Game.gameName, Game.gameVersion, ...&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow to save strings in RulesParams&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add &#039;parent&#039; field to Spring.GetUnitPieceInfo&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GadgetHandler:&amp;lt;br&amp;gt;add several missing callins (AllowStartPosition, ...)&amp;lt;br&amp;gt;expose actionHandler through gadgetHandler table (seems to be a common enough mod)&amp;lt;br&amp;gt;log if callin is not implemented&amp;lt;br&amp;gt;unify callin lists (now all in callins.lua)&amp;lt;br&amp;gt;add missing projectileID argument to UnitDamaged&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaOpenGL::Draw{List,Func}AtUnit: just use drawPos or drawMidPos&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; gl: add callout UniformArray(number location, number type, table uniforms) -&amp;gt; nil&amp;lt;br&amp;gt;(type can be one of {0 = int, 1 = float})&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; gl.CreateShader: support uniform arrays (table values with more than 4 and up to 32 elements)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; gl.CreateShader: make &#039;definitions&#039; a recognized key (whose value should be a subtable or string of shader #define&#039;s)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.{Get,Diff}Timer(s): save some precision (important with new high-resolution timers)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.DiffTimers: accept optional third argument (boolean) to return dt in milliseconds&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; add some utility functions to the math table, see http://springrts.com/wiki/Lua_MathExtra&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; LoadingMT: add a runtime check that should detect incompatibilities&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disable ARB shaders with Intel/Mesa drivers (can be overridden by setting ForceEnableIntelShaderSupport=1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduce used varyings in SMF GLSL shader in the hope it will fix advmapshading on some lowend GPUs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; render MiniMap to a texture and update it async from screen (new configtags: MiniMapRenderToTexture &amp;amp; MiniMapRefreshRate)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not draw ground reflections in water if drawGround=false&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; 3DModel: do not set tex1 to &#039;default.png&#039; (it breaks assimp&#039;s auto-texturing ability)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SMFFragProg: fix &#039;#version must occur before any other statement&#039; and eliminate dynamic branching&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; implement Lua-bindable map and model normal/depth/material buffers&amp;lt;br&amp;gt;note: this is *FULLY* compatible with custom Lua UnitRendering&amp;lt;br&amp;gt;shaders (even easier if some minor framework changes are made)&amp;lt;br&amp;gt;so the vast majority of deferred rendering operations is now&amp;lt;br&amp;gt;within Lua&#039;s abilities&amp;lt;/span&amp;gt;&lt;br /&gt;
==&amp;lt;br&amp;gt;new configuration-keys to enable/disable G-buffer draw-passes&amp;lt;br&amp;gt;AllowDeferredMapRendering (default true)&amp;lt;br&amp;gt;AllowDeferredModelRendering (default true)==&lt;br /&gt;
==&amp;lt;br&amp;gt;new LuaUnsyncedCtrl callouts to enable/disable G-buffer updates&amp;lt;br&amp;gt;Spring.SetDrawGroundDeferred(boolean) -&amp;gt; nil&amp;lt;br&amp;gt;Spring.SetDrawModelsDeferred(boolean) -&amp;gt; nil==&lt;br /&gt;
==&amp;lt;br&amp;gt;new LuaUnitRendering Material keys&amp;lt;br&amp;gt;&amp;quot;standard_shader&amp;quot; (same as &amp;quot;shader&amp;quot;)&amp;lt;br&amp;gt;&amp;quot;deferred_shader&amp;quot; = {vertex = ..., ...}&amp;lt;br&amp;gt;&amp;quot;deferred&amp;quot; (same as &amp;quot;deferred_shader&amp;quot;)==&lt;br /&gt;
&amp;lt;br&amp;gt;deferred fragment shaders must *ONLY* write to gl_FragData[i] where&amp;lt;br&amp;gt;i = {0 = normals, 1 = diffuse, 2 = specular, 3 = emissive, 4 = misc}&lt;br /&gt;
==&amp;lt;br&amp;gt;new Lua texture names&amp;lt;br&amp;gt;&amp;quot;$map_gb_nt&amp;quot; or &amp;quot;$map_gbuffer_normtex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$map_gb_dt&amp;quot; or &amp;quot;$map_gbuffer_difftex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$map_gb_st&amp;quot; or &amp;quot;$map_gbuffer_spectex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$map_gb_et&amp;quot; or &amp;quot;$map_gbuffer_emittex&amp;quot; // for emissive materials (bloom would be the canonical use)&amp;lt;br&amp;gt;&amp;quot;$map_gb_mt&amp;quot; or &amp;quot;$map_gbuffer_misctex&amp;quot; // for arbitrary shader data&amp;lt;br&amp;gt;&amp;quot;$map_gb_zt&amp;quot; or &amp;quot;$map_gbuffer_zvaltex&amp;quot;==&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;quot;$mdl_gb_nt&amp;quot; or &amp;quot;$model_gbuffer_normtex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$mdl_gb_dt&amp;quot; or &amp;quot;$model_gbuffer_difftex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$mdl_gb_st&amp;quot; or &amp;quot;$model_gbuffer_spectex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$mdl_gb_et&amp;quot; or &amp;quot;$model_gbuffer_emittex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$mdl_gb_mt&amp;quot; or &amp;quot;$model_gbuffer_misctex&amp;quot;&amp;lt;br&amp;gt;&amp;quot;$mdl_gb_zt&amp;quot; or &amp;quot;$model_gbuffer_zvaltex&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Buildprocess==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; updated gentoo overlay url to https://github.com/springlobby/overlay&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; switch to mingw64 for the windows build&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove some custom Find*.cmake files&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3645 Can&#039;t build if source directory has white spaces&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; removed VS project files / fix compile with Visual Studio 2012 Express for Windows Desktop:&amp;lt;br&amp;gt;use cmake -G &amp;quot;Visual Studio 11&amp;quot; to generate project files&amp;lt;br&amp;gt;dropped support for Visual Studio 8, 9 &amp;amp; 10&amp;lt;br&amp;gt;see http://springrts.com/wiki/Building_Spring_on_Windows&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; compile Spring using c++11 standard&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix clang compile errors + some bugs detected by clang&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; slightly refactored build system, now every target can be disabled:&amp;lt;br&amp;gt;spring-dedicated, spring-headless, spring-legacy, spring-multithreaded&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more unittests (extended FileSystem, timers, unitsync, SSE Matrix Math, ...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some errors when running spring in-source (AI / Interfaces are still broken)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove unused libspringserver&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; fix {Get,Set}UnitWeapon{Fire,HoldFire,TryTarget,TestTarget,TestRange,HaveFreeLineOfFire} WeaponID argument to use the same 1-starting indexes as rest of lua interface&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4092 (empty pieces Explode()&#039;d with PF_FIRE flag leave behind small stationary fire FX)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4079 (resurrecting could lead to multiple units created by one wreck)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4078 (float--&amp;gt;int conversion overflow)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4073 (fuel-level of unit is lowered upon completion)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4070 (units can skip attack orders in their queue)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4068 (the &amp;quot;wrong cursor for certain attack commands&amp;quot; part)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4057 (double BeamLaser visualisation)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4054 (homing missiles miss radar dots of flying units)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4047 (ground decals don&#039;t fade away)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4043 (constructors can build large units ontop of themselves &amp;amp; walk through &#039;gaps&#039;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4023 (allow &#039;key&#039;=value options-table format in Spring.GiveOrderTo*)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4019 (receiveTracks not working reliably)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4011 (GetTeamStartPosition cannot determine whether start position was placed by player)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4010 (disable /spectator before gamestart)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #4007 (large-radius air transports failing to load transportees)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3980 (air transports set to &#039;Land&#039; wander around while idling if loaded)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3979 (unhelpful error message)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3974 (out-of-fuel bombers set to &#039;Land&#039; fly all over the map)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3973 (aircraft taking off in wrong direction on attack orders)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3961 (expect ArmorDef subtables in array-format, show warning if armordefs contains old-style subtable entries)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3959 (&amp;quot;flying&amp;quot; ground-units colliding with aircraft looks unrealistic)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3957 (Unit icons of underwater units are drawn at water level instead of actual depth)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3951&amp;lt;br&amp;gt;submissile was being checked in the base-class for all&amp;lt;br&amp;gt;weapons despite being a TorpedoLauncher-only property&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3948 (broken voidwater shading)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3941 (CBitmapMuzzleFlame doesn&#039;t render when dir is &amp;lt;0 -1 0&amp;gt;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3937 (transport unloading on top of non-blocking objects)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3924 (add callout Spring.UpdateInfoTexture(number texMode) --&amp;gt; boolean)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3890 (Unloaded units fly across the map)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3873 (lag while loading model-less features)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3862 (aircraft overshooting/flailing around repair pads, also #3834)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3861 (BeamLaser does not hit if it starts within hitvolume)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3855 (LosHandler bug that made provided full LOS on underwater units in radar coverage)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3835 (try to avoid clash between Weapon::AutoTarget and MobileCAI::AutoGenerateTarget)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3785 (Construction aircraft getting stuck)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3783 (add FailedCommand sound to default sounds.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3765 (make Gaia the default feature team, not -1/0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3754 (high decal-strength unit tracks drawn twice due to alpha-wraparound)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3752 (safeguard execution of SimFrame() against garbage keyframe messages)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3743 (partially: make non-hovering aircraft start turning to goal during takeoff)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3739 (apply impulse to aircraft)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3737&amp;lt;br&amp;gt;gadget:AllowStartPosition() now receives the raw&amp;lt;br&amp;gt;unclamped start position as three extra arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3736 (TextureAtlas crash)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3720 (unit pushed through impassable part of factory)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3718 (units moving in circles near obstacles)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3715: make all info-textures individually queryable by Lua (gl.Texture)&amp;lt;br&amp;gt;&amp;quot;$info&amp;quot; and &amp;quot;$extra&amp;quot; still map to the active info-texture as before&amp;lt;br&amp;gt;&amp;quot;$info_losmap&amp;quot; or &amp;quot;$extra_losmap&amp;quot; map to the  L-view texture&amp;lt;br&amp;gt;&amp;quot;$info_mtlmap&amp;quot; or &amp;quot;$extra_mtlmap&amp;quot; map to the F4-view texture&amp;lt;br&amp;gt;&amp;quot;$info_hgtmap&amp;quot; or &amp;quot;$extra_hgtmap&amp;quot; map to the F1-view texture&amp;lt;br&amp;gt;&amp;quot;$info_blkmap&amp;quot; or &amp;quot;$extra_blkmap&amp;quot; map to the F2-view texture&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;textures contain no data until user switches to their respective modes&amp;lt;br&amp;gt;non-active textures are not updated in the background, so will go stale&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3714 (minimap icons of enemy units visible after /spectator plus /specfullview 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3697&amp;lt;br&amp;gt;Spring.GetPositionLosState now returns a 4th argument which indicates&amp;lt;br&amp;gt;if a position is actively being radar- or sonar-jammed by any allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3686 (free flying ground units follow terrain slope)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3683 (minimap textures not freed on exit)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3681 (make widgetHandler:LoadConfigData() more robust)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3675 wrong loglevel in unit_script.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3665&amp;lt;br&amp;gt;AllowStartPosition now receives the ready-state of&amp;lt;br&amp;gt;each player as an argument too, making its complete&amp;lt;br&amp;gt;signature as of 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;AllowStartPosition(&amp;lt;br&amp;gt;number clampedPos.x, number clampedPos.y, number clampedPos.z,&amp;lt;br&amp;gt;number playerID,&amp;lt;br&amp;gt;number readyState,&amp;lt;br&amp;gt;number rawPickPos.x, number rawPickPos.y, number rawPickPos.z&amp;lt;br&amp;gt;)&lt;br /&gt;
==&amp;lt;br&amp;gt;where readyState can be one of&amp;lt;br&amp;gt;PLAYER_RDYSTATE_UPDATED = 0 -- player picked a position&amp;lt;br&amp;gt;PLAYER_RDYSTATE_READIED = 1 -- player clicked ready&amp;lt;br&amp;gt;PLAYER_RDYSTATE_FORCED  = 2 -- game was force-started (player did not click ready)&amp;lt;br&amp;gt;PLAYER_RDYSTATE_FAILED  = 3==&lt;br /&gt;
&lt;br /&gt;
::::*&amp;lt;span class=warning&amp;gt; the default &#039;failed to choose&#039; start-position is now just (0,0,0), not (0,-500,0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3662 (secret)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3660 (memory leak in Spring.GetVisibleFeatures)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3655 (UnitDef::canMove misinterpreted by factory CAI code)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3653 (clash between mutually push-resistant units moving to same spot)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3643 (get PFS and CD to agree regarding factories)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3641 (fix several issues with units using per-piece collision volumes)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3640 (Groundplates don&#039;t disappear when out of LOS)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3637 (desyncs due to not versioning cache-data, also #3692)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3633 (non-3DO projectile models not being rendered fully)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3623 (broken PPCV offsets for DAE models)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3617 (ship transports can&#039;t load units)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3614 (units stuck on narrow terrain passages)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3606 (TorpedoLauncher force-attack aims at water surface)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3598 (&amp;quot;vibrating&amp;quot; ground units due to gravity)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3373 (crash when exiting before countdown finished)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #1368 (AllowBuildStep only called for building)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; fix ground units not moving in FPS mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix (non-hovering) aircraft jittering at high altitude&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix submarines being considered &amp;quot;underwater&amp;quot; even when pos.y + height &amp;gt; 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix subtle bug in LegacyAtlasAlloc::Allocate exposed by Intel GMA&amp;lt;br&amp;gt;atlas could grow LARGER than its maximum size in x-dimension due to TEXMARGIN not being considered&amp;lt;br&amp;gt;3DO texture atlas has a maximum size of 2048 pixels but grew to 2050 pixels in at least one *A game&amp;lt;br&amp;gt;on Intel hardware with maxTextureSize=2048 this caused driver memory corruption --&amp;gt; random crashes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units switching team-colors&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix debug-vectors for ground units being drawn even when not cheating or not spectating&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix LoadScreen exception being thrown just for failing to load a startpic&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash in Spring.GetVisibleUnits on bad teamID value&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix C stack overflow in Shard&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix logLevel of WatchDog stacktraces&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix decals were rendered twice&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix spike CEGs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units with PPCV&#039;s ignoring mouse-rays; run PPCV test before CV test&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix possible bug in MoveCtrl.SetMoveDef&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t automaticly set &amp;quot;MaxSounds&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; try to fix &amp;quot;[Sound] Error: CSoundSource::Play: Unknown Internal Error&amp;quot; on Mac&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; removed unused AI_UnpauseAfterInit config setting&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UnitSync==&lt;br /&gt;
*&amp;lt;span&amp;gt; add DeleteSpringConfigKey(const char* name)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=94.1=&lt;br /&gt;
*&amp;lt;span&amp;gt; bump path cache version&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=94.0=&lt;br /&gt;
==Misc==&lt;br /&gt;
*&amp;lt;span&amp;gt; default LogFlush to true again&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash at start related to Optimus&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove Tobis rapid client (its broken)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add multi engine type support&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; recycle unit and feature ID&#039;s less quickly again, a la 91.0 and prior&amp;lt;br&amp;gt;although this was an unintentional change in 92.* / 93.*, it exposed&amp;lt;br&amp;gt;many bugs in widgets and gadgets which INCORRECTLY assumed ID&#039;s were&amp;lt;br&amp;gt;globally unique for all time --&amp;gt; check your code for more latent bugs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; automatic runtime recompression of groundtextures to ETC1 (future MESA drivers should support ETC)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3591 (UnitFromFactory(..., userOrders) always passes userOrders=false)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3561 (units getting stuck on edges of impassable areas --&amp;gt; pathing is no longer FUBAR)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3575 (QTPFS terrain deformation lagspikes)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3580 (decreased unit/feature ID randomness)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3557 (TorpedoLauncher weapon fires only when on land)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3564 (sun-flare visible when obscured by terrain)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3553 (sun-flare has harsh edge)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3562 (units are reluctant to fire in crowded situations after &#039;fix #3488&#039;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3559 (avoidGround weapon tag is broken)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3563 (units rub against building edges and slow down to a crawl) and #3592 related to it&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3567 (transported nanotowers periodically teleporting to ground)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3520 (kamikaze units always have bad attack cursor when giving manual attack command)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3531 (wrong textures assigned to assimp models)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3545 (AddUnitImpulse() causes unit to move in random direction)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3544 (units briefly invisible when transferred to another team)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3490 (ships cannot be transported by aircraft)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3596 (in debug-mode the firing-cone visualisation of weapons points up)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;fix #3506 (wrong calculation of goffset for assimp model pieces)&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix pseudo-static units (nanotowers, etc) no longer being transportable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3569 (texturing for OBJ and ASS projectile models)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix OBJ models being parsed by assimp&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix SEGV on exit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix flashing team colors&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some trees drawn after being destroyed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.UnitWeapon{Fire,HoldFire}(number unitID, number weaponID) --&amp;gt; nil&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add callouts Spring.GetUnitWeapon{TryTarget,TestTarget,TestRange,HaveFreeLineOfFire}(number attackerID, number weaponID, number attackeeID | [number targetPosX, number targetPosY, number targetPosZ]) --&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.SetProjectileTarget(number projectileID, [number objectID, string objectType] | [number x, number y, number z]) --&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.GetProjectileTarget(number projectileID) --&amp;gt; number targetID, string targetType&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.SpawnProjectile(number weaponDefID, table projectileParams) --&amp;gt; number projectileID | nil&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add MoveCtrl.SetMoveDef(number unitID, number moveDefID | string moveDefName) --&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add projectileID argument to UnitPreDamaged&amp;lt;br&amp;gt;OLD signature: unitID, unitDefID, unitTeam, damage, paralyzer [, weaponDefID               [, attackerID, attackerDefID, attackerTeam] ]&amp;lt;br&amp;gt;NEW signature: unitID, unitDefID, unitTeam, damage, paralyzer [, weaponDefID, projectileID [, attackerID, attackerDefID, attackerTeam] ]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=93.2=&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed unitsync in linux static builds&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=93.1=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed treedrawer crash&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed MT crashes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed X11 cursor offset&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed smooth camera transitions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed clipped sun&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed selection sounds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed attack cursor for kamikaze units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed wrong assimp texture&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=93.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed disappearing GUI with non-GLSL drivers &amp;amp; grass rendering (3dtrees=1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed not working assimp textures&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed /ally&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed /chat[|ally|spec|all], so it doesn&#039;t misbehave when called from lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed attack-ground orders placed on water&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bug in footprint overlap detection reported by dnw&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make dead/crashing/stunned units unshareable (may fix #3476)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed objects with cylindrical CVs would not take damage if hit in rear endcap&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; block Lua from creating non-uniformly scaled COLVOL_TYPE_SPHERE volumes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make sure pastetext and buffertext don&#039;t strip whitespaces from the attached message&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow whisper between spec &amp;lt;-&amp;gt; spec (player -&amp;gt; spec and spec -&amp;gt; player whispers are still forbidden)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed flying transport reservation not flushed properly with area commands (#3478)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3481 (unit targets not flushed on cloak + jam)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3488 (avoidFriendly check works improperly if firepoint is inside friendly unit)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bug in ray-ground intersection logic&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make mutual push-resistant unit collisions more like 0.82.x (smoth&#039;s issue)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some cases of units getting perma-stuck (s.t. even spammed user orders cannot free them) on terrain, esp. #3423&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3506 (wrong calculation of goffset for assimp model pieces)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3505 (ground-transported units cannot be killed)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #3465 (WeaponDef infolog error messages are unhelpful)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix attack-ground orders placed on water&amp;lt;br&amp;gt;GuiTraceRay now stops at water surface by default, not ocean floor&amp;lt;br&amp;gt;add sixth argument &#039;ignoreWater&#039; to LuaUnsyncedRead::TraceScreenRay&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
*&amp;lt;span&amp;gt; support double-resolution yardmaps for buildings (these require four times as many characters, beware)&amp;lt;br&amp;gt;the engine will interpret a yardmap string as such if its FIRST (and ONLY its first) character is &#039;h&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pr-Downloader==&lt;br /&gt;
*&amp;lt;span&amp;gt; workaround CVE-2013-0249 (disable all protocols expect http/https)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduce log messages&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix invalid timeout&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix ignored depends in http-downloads&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Assimp==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; apply rotations &amp;amp; scalings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed per-piece colvols&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=92.0=&lt;br /&gt;
==Major Changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; Linux cross-distro binary builds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; much faster Sim (~20% and ~50% with working OMP)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new cmdline arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; better pathing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add experimental map generator (see http://springrts.com/wiki/Mapgen for details)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some new sim/weapon features&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; Shard update&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: refactor / fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: add BAR config&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: update XTA config, to work with XTA &amp;gt; 9.71&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bug in /aikill&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==pr-download==&lt;br /&gt;
*&amp;lt;span&amp;gt; new --download-engine&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixes / speedups&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add c-api to shared lib &amp;amp; use it for pr-downloader&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; fix return in GetInfoMapSize (#2996)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; no crashes in unitsync without init any more (#3120)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; ProcessUnits, GetUnitCount, GetMapCount, GetMapArchiveCount,&amp;lt;br&amp;gt;GetInfoMap, GetPrimaryModInfoCount,GetPrimaryModArchive,&amp;lt;br&amp;gt;GetSideCount, GetModOptionCount, GetCustomOptionCount,&amp;lt;br&amp;gt;GetSkirmishAICount, GetInfoValueInteger, GetInfoValueFloat,&amp;lt;br&amp;gt;GetOptionType, GetOptionNumberDef, GetOptionNumberStep,&amp;lt;br&amp;gt;GetOptionStringMaxLen, GetOptionListCount and GetModValidMapCount&amp;lt;br&amp;gt;returns now -1/-1.0f on error&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; make TeamHandler::IsActiveTeam check Team::isDead&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; gl.UnitPieceMatrix &amp;amp; gl.UnitPieceMultMatrix do now the same and work from UnitSpace &amp;amp; aren&#039;t recursive anymore (don&#039;t depend on the parent-piece)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove LuaLobby&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; enable luasocket as default and always allow to listen (UDP &amp;amp; TCP)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Spring.GetTerrainTypeData (already on wiki)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Spring.GetUnitCurrentBuildPower(unitID) -&amp;gt; number 0..1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Spring.SetUnitNanoPieces(unitID, {piece1, piece2, ...})&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Spring.GetUnitNanoPieces(unitID) -&amp;gt; table {piece1, piece2, ...}&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; replace Spring.Echo with Spring.Log in most places in cont/&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaUnsyncedCtrl: make Spring.GetConfig* return non-nil (= 0) values when LuaModUICtrl=0 (3280)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Lua: make Spring.GetPlayerRoster really return a boolean for spectator as the wiki says&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when calling Script.Kill() (3292)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Spring.GetUnitNearestAlly takes self into account (3293)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.SetTerrainTypeData now only updates pathfinder when there is a real change (performance)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash in LuaUnitDefs when trying to read deathExpWeaponDef (#3333 &amp;amp; #3325)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.GetReplayLength()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.GetConfigParams()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.GetUnitWeaponTryTarget(uid, wid, [number posx, number posy, number posz] | [number enemyid]) -&amp;gt; nil | boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix error spam on malformed Lua-issued unload commands (#3378)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash caused by comparing strings with numbers in base-content&#039;s weapondefs_post.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add mapHardness to the Game constants table (#3390); make Spring.GetGroundInfo now match its wiki documentation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make Create{Feature, Unit} take an optional (7th, 9th) {feature,unit}ID argument to spawn a feature/unit with a specific ID&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make CreateUnit take an optional (10th) builderID argument&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; deprecate LuaUnitDefs.extractSquare&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; replace LuaFeatureDefs.deathFeature(string) by LuaFeatureDefs.deathFeatureID(number)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash in Spring.GetVisibleFeatures (#3400)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Spring.GetFeatureDirection returning direction in (x,z)-plane only (#1599)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; couple the AllowWeapon* callins to SetWatchWeapon state&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add optional 4th argument to Spring.SetUnitImpulse to control a unit&#039;s impulse decay-rate (now unhardcoded)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; Game.version now returns the same as `spring --sync-version`, e.g. &amp;quot;92.0&amp;quot; or &amp;quot;91.0.1-1283-gf3805a7&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Game.buildFlags (unsynced only) to get additional engine buildflags, e.g. &amp;quot;OMP&amp;quot; or &amp;quot;MT-Sim DEBUG&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Better notification and protection from unbalanced OpenGL matrix stack after return from Lua rendering code&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CollisionVolumes==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; drop support for ellipsoid-cylinders and ellipsoids&amp;lt;br&amp;gt;cylinders with round(!) baseplates are still supported!&amp;lt;br&amp;gt;simplify how damage from an explosion is calculated, fewer magic numbers, etc&amp;lt;br&amp;gt;no more distance approximations means no more invincible units (or features)&amp;lt;br&amp;gt;and no more general &amp;quot;weird&amp;quot; cases like 3103&amp;lt;br&amp;gt;THIS WILL CAUSE BALANCE CHANGES, BE PREPARED&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; get rid of TYPE_FOOTPRINT, it was an alias for TYPE_SPHERE in the continuous case which is now default and the&amp;lt;br&amp;gt;original intent (a shape defined by the CSG intersection of sphere and footprint) would have been tricky to get&amp;lt;br&amp;gt;right&amp;lt;br&amp;gt;instead support a {Unit,Feature}Def key &amp;quot;useFootPrintCollisionVolume&amp;quot; which&amp;lt;br&amp;gt;makes a collision volume a box with dimensions equal to the object&#039;s footprint&amp;lt;br&amp;gt;(this overrides any custom scaling and/or offsets)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; let projectiles explode _on_ collision volumes and not in a interpolated pos in front of it&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rework projectile-vs-volume special cases so they can be distinguished better for the above&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; rewrite TraceRay::{TestConeHelper, TestTrajectoryConeHelper} for #3399&amp;lt;br&amp;gt;these now no longer use any bounding-radius approximations to&amp;lt;br&amp;gt;figure out if an object will potentially be hit, but calculate&amp;lt;br&amp;gt;the exact colvol surface distance taking spread into account&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pathing==&lt;br /&gt;
*&amp;lt;span&amp;gt; faster updates&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; legacy: use omp in ::Update to multithread a function that eats 40% of the time spent in ::Update&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; this gives a _massive_ boost with like &amp;gt;30% more FPS&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; it needs low latency omp threads to work, those are currently broken in gomp, the bug will be fixed with the next release of gcc&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; QTPFS: a lot of fixes &amp;amp; optimizations, fixed dev-build desync (#3339), made cache reads/writes atomic, read constants from MapInfo&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; give pathfinder debug-data drawing its own shortcut (alt+p)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rewrite collision handling between units and static objects (again)&amp;lt;br&amp;gt;instead of using impulse to push units away, do SCII-style strafing&amp;lt;br&amp;gt;results: www.youtube.com/watch?v=4rycY4JfLGs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; put on upper limit on directional slope tolerance for &amp;quot;downhill&amp;quot; slopes&amp;lt;br&amp;gt;before, units could move across ANY downhill slope if they ended up there&amp;lt;br&amp;gt;and directional checking was enabled; now the downhill slope-tolerance is&amp;lt;br&amp;gt;limited to twice the uphill tolerance&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; set avoidMobilesOnPath to true by default again&amp;lt;br&amp;gt;pro: groups moving without a ctrl-order clump much less&amp;lt;br&amp;gt;contra: groups moving with a ctrl-order are less organized&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units moving orthogonally across too-steep faces (and getting stuck afterwards)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix humping triggered when unit crushes feature and feature spawns a non-crushable&amp;lt;br&amp;gt;replacement (if unit&#039;s next waypoint happens to be inside replacement&#039;s footprint)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; change precondition for crushing units from &#039;collider must be moving&#039; to &#039;collider impulse must exceed collidee impulse&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; units that are mutually forbidden from pushing each other will no longer get stuck blocking the other party&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; units moving toward the same spot will no longer clump up into a jiggly ball (#3355 &amp;amp; #3381)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; units with low delta-v no longer receive bogus move orders after being told to stop (#3358)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; actively push units away from speedmod=0 squares when possible&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UnitScripts==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LUS/COB: deprecate QueryNanoPiece() makes SimCode ~10% faster use the new Spring.SetUnitNanoPieces instead&amp;lt;br&amp;gt;Note, once set the engine won&#039;t call `QueryNanoPiece` anymore and instead randomly toggles between the set nanopieces,&amp;lt;br&amp;gt;saving a lot time-consuming COB/LUS calls.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LUS/COB: cache QueryNanoPiece() results&amp;lt;br&amp;gt;Note, this stops QueryNanoPiece() calls after 31 times no matter what!&amp;lt;br&amp;gt;This breaks ZK&#039;s LupsNanoSpray, fixed version can be found here http://gw.gd/Zaae.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Models/Assimp==&lt;br /&gt;
*&amp;lt;span&amp;gt; support a 2nd texcoord&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; auto-calc midPos&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; read texture filepaths from modelfile if available&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; extended auto-finding of textures&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weapons/WeaponDefs==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove of manualBombSettings (backward-compability code in weapondefs_post.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; fix: half craterAreaOfEffect the same way as it is done with damageAreaOfEffect&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; removed color1 (hue) &amp;amp; color2 (sat). Use rgbColor instead!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; removed isShield. Use weaponType=&amp;quot;Shield&amp;quot; instead!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new &#039;interceptSolo&#039;, if true (=default) don&#039;t allow any other interceptors to target the same projectile&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow any weapons to be interceptors/targetables (not that all combinations work/make sense)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; stop subs/AA-fighters trying to chase hovers and tanks (check all equipped weapons if they can target the unit, before _auto_ chasing enemies in FireAtWill)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; all weapons will now obey avoidFriendly, avoidNeutral, avoidFeature + avoidGround&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; add new avoidGround weapondef tag (default true)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FeatureDefs==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove &amp;quot;nodrawundergray&amp;quot; now that there is a proper &amp;quot;floating&amp;quot; tag&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==GameServer==&lt;br /&gt;
*&amp;lt;span&amp;gt; a new GameID tag to script.txt&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; always account local players (even when host is a spectator!)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; don&#039;t lower-limit gameSpeed to `userSpeedFactor * 0.5f` when userSpeedFactor is greater than 2&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make game ways more responsive when running at high speeds&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
*&amp;lt;span&amp;gt; add /ReloadShaders&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; less jerky camera transitions (thx cleanrock)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make camera a bit smoother by adding some micro-transitions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; pressing F5 no longer hides the minimap in dualscreen mode (#3095)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SMF/MapInfo: new tag voidGround&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;only FreeCamera allows to set FOV ingame&#039; (3291)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not spam unit self-destruct messages when spectating&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new configtag &amp;quot;StacktraceOnGLErrors&amp;quot;: Create a stacktrace when an OpenGL error occurs (only available in DEBUG builds)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix performance leak in CSolidObject::Block()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make UnitScript::{ScriptToModel, ModelToScript} O(1) instead of linear&amp;lt;br&amp;gt;(TODO: UnitScript::HaveListeners is another new O(n) source)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove OSC&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add new `cursorattackbad` mousecursor, used for static defense when giving a CMD_ATTACK&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; get rid of the &#039;extractSquare&#039; non-feature for extractor buildings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; when a team dies, redistribute unit-limits over the remaining teams in that team&#039;s allyteam (also means dead teams can no longer produce any units)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; record demos in-memory to make speccheating 1% harder&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make hovercraft with non-zero waterline transition into/out of water more smoothly&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make unit movement more physically-based:&amp;lt;br&amp;gt;add modrule &#039;allowGroundUnitGravity&#039;; allows fast units to catch air&amp;lt;br&amp;gt;add modrule &#039;allowHoverUnitStrafing&#039;; allows hovercraft to slide in turns&amp;lt;br&amp;gt;ground units cannot change speed or direction in mid-air&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; in god-mode, units can now be selected and commanded by any player even when not spectating (#3412)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix multiple build-started sounds being played when ordering single builder to construct something&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; UnitDef::can{Restore, Repair, Reclaim, Capture, Resurrect} now default to true only if the unit is&amp;lt;br&amp;gt;a builder and has the corresponding {Terraform, Repair, Reclaim, Capture, Resurrect}Speed property&amp;lt;br&amp;gt;set to a non-zero value&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; speedup minimap icon rendering&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix a few OpenGL errors reported by MESA drivers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix SimpleParticleSystem directional particles disappearing (#1665)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ROAM: resize pool when running out of nodes fixes rendering on maps like Knockout&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disable occlusion query in BumpWater it doesn&#039;t work and just makes it slower&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; move `lastFrameTime` calculation from the end of a drawframe to the beginning this way vsync locktimes are counted to the previous frame time&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; removal of DepthBufferBits &amp;amp; StencilBufferBits&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; BumpWater renders now with shadowmap &amp;amp; infotex&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; clamp map ShadowDensity 0..1 (fixes shadow distortions on maps like Iamma)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use VBOs for S3O and OBJ model piece geometry&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix grass shadow rendering (no self-shadowing yet)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; changed `usable` range of GrassDetail configtag, so you can set it now &amp;gt;10 to increase viewrange w/o getting Tribble plushies&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sim Bugfixes==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; stop buildframe decaying on reclaiming&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix unload commands close to map edges are ignored (3175)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix nukes (3269)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some issues with bombers (3253)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix MANUALFIRE hangs despite no target lock&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix gunship jumping on takeoff (3526)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make sure unsupported build orders are never given to new factory buildees (3257)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix aircraft failing to land properly on repair pads (3260)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix gunships jittering when stunned (3262)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix builders &#039;ignoring&#039; wait-orders when reclaiming&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; fix units failing ground-attack orders when their &amp;quot;main&amp;quot; weapon != weapons[0] (3276)&amp;lt;br&amp;gt;logic change: MobileCAI::ExecuteAttack now cycles through all weapons until&amp;lt;br&amp;gt;it finds one which can execute the order, and no longer depends on weapon[0]&amp;lt;br&amp;gt;being the &amp;quot;main&amp;quot; weapon&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units gaining negative experience when shooting at dead targets&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix old logic error in obstacle avoidance handling (IMMOBILE objects were being ignored --&amp;gt; no wonder the &amp;quot;infinite bouncing bug&amp;quot; was so pronounced)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Crashing aircraft can be reclaimed&#039; (3288)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Units get stuck in sea labs on build completion&#039; (3290)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Paralyzed landed aircraft start moving forward slowly&#039; (3287)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bug reported by jamerlan (http://springrts.com/phpbb/viewtopic.php?p=529204#p529204)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make HoverAirMoveType aircraft able to crash (3289)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Move/Turn (piece) fails with negative speed&#039; (3300)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &amp;quot;Total velocity loss during a prolonged unit-to-unit [skidding] collision&amp;quot; (3302)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Units with height advantage are unable to force fire with that range&#039; (3303)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix air transports have trouble loading multiple units if units are large (3307)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix partly reclaiming factory allows unit teleportation/remote destruction (3308)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;SetFeaturePosition snapToGround get reset when there is terraform nearby&#039; (3243)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; disable collision checking between transporter &amp;amp; transportee&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix being-built units having order queues overwritten upon completion (#3342)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix FPE&#039;s in {Large}BeamLaserProjectile (#3413 &amp;amp; #3414)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix impulse not being applied to features (unit wrecks)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow underwater units to build stuff on the waterplane&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix network connection is not properly closed when an error occurs in pregame (3166)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; extend desync message (send in debugmode for specs too and send correct &amp;amp; got checksum)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &amp;quot;Transport endpoint is not connected&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix secret exploit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix secret exploit #2&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix memory leaks, particularly when the game is minimized&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix several crashes in multithreaded exe&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cmdline Arguments==&lt;br /&gt;
*&amp;lt;span&amp;gt; new --game (-g) &amp;amp; --map (-m)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; if both parameters are set, this starts spring a with minimal setup and it sets the modoption minimalsetup = 1&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; supports fuzzy search e.g. `spring -g ba -m Delta` or `spring -g zk -m &amp;quot;Delta X&amp;quot;`&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; renamed shortarg -m (--minimised) to -b (~background)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new `spring --list-def-tags`, will in future return all Unit-, Weapon-, FeatureDefs in a `--list-config-vars` manner (not finished yet)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new benchmark mode (`--benchmark %time_min --benchmarkstart %starttime_min`) writes a benchmark.data parsable by gnuplot&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==OS==&lt;br /&gt;
*&amp;lt;span&amp;gt; set affinity of omp threads&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; search script.txt &amp;amp; demofiles in $PWD&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; detect Valgrind and disable Watchdog &amp;amp; syncing (it won&#039;t let us change the FPU state) if it is running&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t install crash handler when core dumps are enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Buildprocess==&lt;br /&gt;
*&amp;lt;span&amp;gt; boost 1.50 compatibility&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; detect ld.gold and compress debugsymbols&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; update 7z to v9.22&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use tcmalloc when found (new USE_TCMALLOC use-flag)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add target headercheck&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
*&amp;lt;span&amp;gt; OpenMP build&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; update to boost 1.50&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; slightly improve speed of zip / sdz archives (#3338)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Nvidia Optimus support&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed springsettings.exe as its directly included in springlobby&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
*&amp;lt;span&amp;gt; Linux&#039;s ctrl+c: `hardkill` after 10sec (and 5 seconds softkill)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; workaorund issue in FOSS ati drivers with NPOT cursors&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=91.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Linux sync errors&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix QTPFS deadlocks&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=90.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix endless loop in Shard in mingw32 builds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix builders sometimes don&#039;t notice when a building was finished by another unit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix SkyBox corruption&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix QTPFS deadlock at start&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; partially revert the &amp;quot;lock-on targeting&amp;quot; behavior:&amp;lt;br&amp;gt;If a user-selected target moves out of range, the lock is&amp;lt;br&amp;gt;now broken as it used to be and automatic targeting is not&amp;lt;br&amp;gt;blocked anymore (though this can take some SlowUpdate&#039;s).&amp;lt;br&amp;gt;For ground-attack orders it is still in place, since the&amp;lt;br&amp;gt;behavior seems to be preferred (so a unit that is told to&amp;lt;br&amp;gt;attack a position and then to move away will keep firing&amp;lt;br&amp;gt;even when other targets are available)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; really fix &amp;quot;endgame stats only show APM for self&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; really fix &amp;quot;Size of unidentified radar blips can be determined with mouseover&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix ship wreckage drag&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix gunships don&#039;t obey land/fly state&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Bombers with fight command do not fire&#039; (3190)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Emit-sfxed weapons point at {0, 0, 0}&#039; (3205)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix an incorrect watchdog trigger before gamestart&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Aiming animations ignore maxAngleDif [actually tolerance]&#039; (3180)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Grass is not animated in LOS view&#039; &amp;amp; &#039;LOS view does not render trees in the same way&#039; (3207 &amp;amp; 3203)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix `halo` in BumpWater with EndlessOcean &amp;amp; OwnRefractionRenderPass&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Bombers with area attack dont work &#039; (3195)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;If air constructor lands it often fails to do next construction command&#039; (3198)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make fight commands work with noAutoTarget weapons (3190 #2)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Constructor stops before it enters build range&#039; (3210)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bugged/all-white decals when shadows=0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units being able to move down steep cliffs (directional slope-tolerance needs work)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix dangling pointer/memory corruption in QuadField (3211)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Reclaiming units under construction results in no resources being returned&#039; (3216)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some OpenGL usage errors found by [teh]decay&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Gunships dont always aquire targets despite fireatwill+roam+fly&#039; (3221)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;TargetBorder=1 only works when a unit has a specific attack command&#039; (2971)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix CFeature::ForcedMove (3226)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Spring crashes when sending large messages (3228)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Armed constructors attack neutral units on Fight order&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; restore old shield visibility behaviour (3242)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Units with cannons remain out of range when you force fire onto high ground&#039; (3241)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disable unit pushing bidirectionally when one of the parties is non-blocking&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sim==&lt;br /&gt;
*&amp;lt;span&amp;gt; make target locking optional via meta-key&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==GameServer==&lt;br /&gt;
*&amp;lt;span&amp;gt; support start-scripts of arbitrary size (still not advised to use scripts bugger than 256kB, and we won&#039;t optimize anything related to such huge scripts)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UnitDefs==&lt;br /&gt;
*&amp;lt;span&amp;gt; make cloakCostMoving default to cloakCost&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WeaponDefs==&lt;br /&gt;
*&amp;lt;span&amp;gt; change default weapon &amp;quot;mainDir&amp;quot; to &amp;quot;0,0,1&amp;quot; (before it was &amp;quot;1,0,0&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; always enable continuous hit-testing (it showed discountinuous one is used &amp;lt;&amp;lt;1%, so it&#039;s not worth to keep it)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FeatureDefs==&lt;br /&gt;
*&amp;lt;span&amp;gt; add explicit `floating` featureDef tag (before it was implicit via nodrawundergray and failing a lot)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; add Spring.SetUnitDirection(unitid, x,y,z)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add `ignoreLOS` tag to Spring.UpdateMapLight&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaRules: add DrawProjectile to complete the Draw* quartet&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ModInfo==&lt;br /&gt;
*&amp;lt;span&amp;gt; add `allowAircraftToHitGround` tag (3199)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; runtime create missing DDS mipmaps when supported by the hardware&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
*&amp;lt;span&amp;gt; call SDL_WarpMouse every frame again (fixes `ghost mouse` in middle click scroll)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; explicit pipe --large-address-aware through -Wl (fixes compiling with tdm-gcc)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=89.0=&lt;br /&gt;
==Major Changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaSocket&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MessageBox for unsupported GPUs (+drivers)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed ATi PointSize bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LOS et al. are rendered now through the GLSL terrain shader (-&amp;gt; shadows in LOS-view)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; added Shard to the windows installer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added pr-downloader as submodule (only compiled if libcurldev is available)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; limit infolog.txt buffer to 8kB&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; open a MessageBox on systems with unsupported GPUs (+drivers) on engine start (suppressible with a config-tag)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove selectkeys.txt support (use uikeys.txt instead)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove TASServer.jar (outdated, use http://springrts.com/wiki/Spring_on_a_LAN )&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; send gameID and SDF filename with SERVER_STARTPLAYING to autohost&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove deprecated LogSubsystems config var&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not send GameOver from a client that timed out&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add LogFlush config var for instant writes (disabled as default)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add UI config-variables AutoAddBuiltUnitsToFactoryGroup (def: false) and AutoAddBuiltUnitsToSelectedGroup (def: false)&amp;lt;br&amp;gt;if the first variable is true, new units auto-inherit their group number from the factory that built them&amp;lt;br&amp;gt;if the first AND second are true, new units are auto-selected if their factory group is currently selected&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; weapondefs.cylinderTargetting spelling fixed, the old one is deprecated&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; exit with !=0 if spring can&#039;t connect to server&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; decrease loglevel for &amp;quot;Load S3O texture now&amp;quot; &amp;amp; luasocket&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; change content-exception (for a missing water texture) in BasicWater to a warning message&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; dedicated server no longer consumes 100% CPU while waiting for gameID&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; headless builds use less cpu-time (nominally 50% instead of 100%)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix  some orders are discarded when issuing commands to landed planes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix  unfinished units with 100% hp can&#039;t be finished&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;crash when getting LOS of a feature without 3d object and drawType!=-1&#039; (3032)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &amp;quot;changing unit speed does not work anymore&amp;quot; (2877/3016)&amp;lt;br&amp;gt;(scripts can now arbitrarily override the UnitDef values, which are only used for initialization)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;LightningCannon can fire into water&#039; (3057)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix BeamLasers and LightningCannons not ignoring stunned shields&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix GameSetupDrawer player-state string (3064)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Con/com gets weird move order after stop command is given&#039; (3069)&amp;lt;br&amp;gt;(was intended to keep factories clear, any side-effects are up to players to deal with)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix stunned=true crashing=true airplanes falling into the void (3078)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix zombie coverage from sensor-units (if activated while in a transport, exploit)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash in unit_script.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &#039;Units stuck in factory&#039; QTPFS bug (3055)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units moving (being pushed) through factory walls&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix terrain water reflections&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix game does not end properly for a player that is being kicked&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix problem to build near map edges&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix ping display after mid-game (re-)join + try to reduce lag after mid-game join&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix missing stack trace if out-of-memory occurs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix missing stack trace on abnormal termination (sigabrt)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix resurrecting an individual wreck results in the resurrector not healing it&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix /godmode and /{luarules,luagaia} {reload,disable} not working in demos (2701)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix targetting bug (weapons sometimes failing to fire at badTargetCategory units) as a result of AllowWeaponTarget misuse&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix kamikaze units not self-d&#039;ing when given an attack order while on hold-fire (2405)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix 3105 (PlayerChanged callin not available in unsynced gadgets)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix 2947 (size of unidentified radar blips can be determined with mouseover)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix 1843 (Spring.GetUnitHealth returned nothing for buildProgress on in-LOS enemy units with &amp;quot;hideDamage=1&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix 3122 (failure to fire at badTargetCategory)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when give all units to uncontrolled team&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix fighters that have a target may refuse to obey orders&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash in GetPlayerTeam (AI)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix sync warning when resizing the main window&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix ctrl/alt/shift keys stuck after alt tab&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make COB&#039;s set(MAX_SPEED) permanent again like its Lua counterpart, rather than&amp;lt;br&amp;gt;letting it apply only temporarily (for the duration of the current move command&amp;lt;br&amp;gt;if any); use negative speed values if you want the change to be non-permanent&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; YardMap changes:&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; more verbose yardmap parsing&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; ignore any whitespaces in yardmap strings (esp. newlines)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; new &amp;quot;i&amp;quot; yardmap code (inverse of &amp;quot;c&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove TA-ism in buildrange code:&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; make buildrange not immobile dependent&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; changed terraform range check a little&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; make terrain restore range check consistent with new terraform one&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; don&#039;t add target&#039;s radius to the builder&#039;s builddistance, only do so if the target is bigger than the builddistance (mostly only true for terraform)&amp;lt;/span&amp;gt;&lt;br /&gt;
:::*&amp;lt;span&amp;gt;&amp;gt; from now on the to be built unit&#039;s centerpos has to be in buildrange not its border!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove obsolete default dependence of cloakCostMoving on cloakCost&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove modelCenterOffset tag (can now be dynamically set with Lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improved behaviour of builder masses&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make StartBox clamping of StartPositions synced&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t reclaim in-the-way features when the buildee is going to morph into a feature of the same type&amp;lt;br&amp;gt;(fixes the ancient bug where ordering a row of features with N &amp;gt; 1 builders causes each to be reclaimed and then immediately rebuilt)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not apply impulse to units being transported&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make falling wreckage (from aircraft) not lose all its forward speed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make ground units consume waypoints less aggressively&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove special treatment for collisions between mutually-pushResistant objects for 3031&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add &#039;allowUnitCollisionOverlap&#039; (def=true) and &#039;useClassicGroundMoveType&#039; (def=false) ModInfo keys&amp;lt;br&amp;gt;the former allows unit movement like www.youtube.com/watch?v=mRtePUdVk2o at the cost of more clumping (learn to use ctrl+lmb formation orders)&amp;lt;br&amp;gt;the latter is a ticket back to unit movement circa 2009: no reversing, no turninplace=false, no smooth collision handling, no nothing (figure it out)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add mod-rule &#039;targetableTransportedUnits&#039; (default false)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; introduce an independent Lua-controllable aim-position (defaults to mid-position) for units and features, used by weapons as their aiming/target point&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make ground units less keen on repairing fast units such as patrolling aircraft&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix distinction between user-selected and internal CommandAI targets&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pathing==&lt;br /&gt;
*&amp;lt;span&amp;gt; QTPFS: less loadscreen spam, make F2 functional, enable corner-connected node topology, use staggered layer-updates, speedups and tweaks&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; QTPFS: increase MAX_TEAM_SEARCHES, decrease LAYERS_PER_UPDATE (more units can request paths per frame, units get paths back more quickly)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; QTPFS: fix assertion failure, make execution of path requests more asynchronous&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; some config values are now write protected (Spring.SetConfig*)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added luasocket support for widgets, see http://springrts.com/wiki/LuaSocket&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed params of Spring.MarkerAddPoint &amp;amp; Spring.MarkerAddLine&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; call AllowWeaponTarget at the end of the queue, so lua only gets those units which are _not_ filtered by the engine&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; LuaSyncedRead: better hide enemy radarblobs unit-info&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; MoveCtrl: remove SetGroundMoveTypeData(unitID, &amp;quot;wantedSpeed&amp;quot;, v) and SetGroundMoveTypeData(unitID, &amp;quot;maxWantedSpeed&amp;quot;, v)&amp;lt;br&amp;gt;(the preferred way for gadgets to change a unit&#039;s speed is by calling SetGroundMoveTypeData(unitID, &amp;quot;maxSpeed&amp;quot;, v))&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; replace Game.gameID by synced callin GameID(string gameID)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix TraceScreenRay never returning &amp;quot;sky&amp;quot; when includeSky=true&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix TraceScreenRay coordinate offset when onlyCoords=true&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix typo in Spring.GetUnitVelocity&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add extra parameter &#039;defPriority&#039; to AllowWeaponTarget (what the engine thinks the target priority should be)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add bool FeatureDefs[xyz].autoreclaim&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add new gl.Texture(&amp;quot;$minimap&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add new gl.Texture(&amp;quot;$info&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove gl.SelectBuffer and co.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Spring.LoadCmdColorsConfig(configStr) &amp;amp; Spring.LoadCtrlPanelConfig(configStr)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add new 3 param &#039;pairwise&#039; to Spring.GiveOrderArrayToUnitArray(), used to send multiple units a single individual command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash due to UpdateCallIn removing the current event client from list being iterated&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add missing team/player callins to (unsyced) GadgetHandler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add new synced callouts Set{Unit,Feature}RadiusAndHeight(number id, number radius, number height) --&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add new synced callouts Set{Unit,Feature}MidAndAimPos(number id, number mpx, number mpy, number mpz, number apx, number apy, number apz) --&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add optional 2nd (boolean midPos) and 3rd (boolean aimPos) arguments to Spring.Get{Unit,Feature}Position to go with the above four callouts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; change Spring.GetUnitPosition to return a unit&#039;s base-position by default, like .GetFeaturePosition does for features&amp;lt;br&amp;gt;(this is usually a point on the model closer to the ground than its mid-position, so may affect some Lua drawing code)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix keys hang after LuaUI tweakmode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [MT] disallow other Lua environments to invoke LuaUI if LuaThreadingModel = 2, to prevent deadlock&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [MT] fix desync with LuaThreadingModel &amp;gt; 2&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [MT] fix teams sometimes wrong in UnitGiven() and UnitTaken()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix DynWater ship wakes, BumpWater shorewaves&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed ATi PointSize bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; update assimp to svn rev 1231&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed assimp lua metafiles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; warn about null normals in models&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add visualization of default object radii (used for AOE calculations, etc) to alt+v&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SMF: render the info-texture through GLSL (noob translation -&amp;gt; shadows in LOS-view)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improved VSync under Linux (with support for AdaptiveVSync)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added FeatureFadeDistance &amp;amp; FeatureDrawDistance config tags&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more failsafe shadow FBO creation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed vibrating planes (again)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix spring_multithreaded hangs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UI==&lt;br /&gt;
*&amp;lt;span&amp;gt; display average draw &amp;amp; sim frame time in debugview&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; draw buildRange for mobile selected units too &amp;amp; always render them on shift hover (also for shield range)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; all items in sounds.lua are now converted to lowercase&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow to create a new &amp;quot;default&amp;quot; item in sounds.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; WeaponDef: support &#039;soundHitWet{Volume}&#039; keys for in-water explosion sounds&amp;lt;br&amp;gt;(the &#039;soundHit&#039; key is now deprecated in favor of &#039;soundHitDry&#039;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
*&amp;lt;span&amp;gt; set IMAGE_FILE_LARGE_ADDRESS_AWARE (increased &amp;gt;2GB memory limit)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; strip CXX_FLAGS &amp;amp; C_FLAGS in build process to prevent sync incompabilities (can be turned off with a new CUSTOM_CFLAGS cmake flag)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; on multicore systems set scheduler to SCHED_BATCH (semi-solves the core hoping issue)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; call SDL_WarpMouse only when needed (fixes massive FPS-drop in middle-click-scrolling)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use a non-locking vsync mechanism &amp;amp; add support for nvidia&#039;s `adaptive vsync`&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; explicit disable all CPU extensions except SSE1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use mtune=generic on 64bit systems&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==OSX==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix stack corruption in sound code&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=88.0=&lt;br /&gt;
==Changes==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; showing collision volumes has now its own command (`/debugcolvol` &amp;amp; `alt+v`)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; use footprint (not model) radii for obstacle avoidance&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improve reconnecting sim/draw balance&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disable line/point smoothing in safemode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; time profiler updates now even when paused&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; MoveInfo read &amp;quot;avoidMobilesOnPath&amp;quot; from correct table and disable it by default (before it was default enabled)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; allow to list files with unsolveable depends&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; warn about usage of deprecated functions in unitsync&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; added new Spring.TestMoveOrder(unitDefID, worldx, worldy, worldz) -&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added new Spring.Log()&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; same as Spring.Echo, but passes metadata to the logsystem&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; to be able to use LOG.XYZ you need to update your system.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; Spring.Log(string logsection, int loglevel, ...)     (with loglevel either: LOG.DEBUG, LOG.INFO, LOG.WARNING, LOG.ERROR, LOG.FATAL)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; Spring.Log(string logsection, string loglevel, ...)  (with either: &amp;quot;debug&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;error&amp;quot;, &amp;quot;fatal&amp;quot; [lower-/uppercase doesn&#039;t matter])&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed WeaponDefs[123].pairs()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added myGravity tag to WeaponDefs[] table (thx DeadnightWarrior)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; distinguish water-damage in Unit{Pre}Damaged&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; water damage has index -5&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; kill damage was -5 before and is now -6&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed multiple crashes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed SPRING_ISOLATED=1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed gcc i686 march flag&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed an aircraft refueling bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed multiple pathing bugs/issues&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed crash at startup when DynamicSun=1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed &#039;Nanoframe targeting and water&#039; (3017)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed desync _warning_ between 32- &amp;amp; 64-bit systems&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed FarTextures with GPU/drivers that don&#039;t support FBOs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed spring-mt &amp;amp; spring-safemode links in window&#039;s startmenu&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed incorrect drawMidPos (e.g. used for command line drawing)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; add vcredist_x86.exe to the installer / remove MSVCR71.dll from mingwlibs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed safemode shortcuts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=87.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; restore pre86.0 maxAngleDif arcs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove the following Lua consts: wdef[id].areaOfEffect, wdef[id].maxVelocity &amp;amp;  wdef[id].onlyTargetCategories&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &amp;quot;LuaUI didn&#039;t got unprocessed /xyz commands&amp;quot; (mantis 2982)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix shield rendering&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; support for zlib 1.2.6 (thx sirmaverick)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash on start when invalid ai is in script.txt&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix multiple pathing &amp;amp; collision issues&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some Maven (Java) updates&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; removed ArchiveMover&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix compile for &amp;quot;make tests&amp;quot; on win32&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=86.0=&lt;br /&gt;
==Changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; new commandline argument &amp;quot;--safemode&amp;quot;: It turns off all features that are known to cause problems on some system.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; ignore features with `blocking=false` in all RayTracing/Aiming functions (other code still checks them!!!)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; enable ROAM in spring-mt&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; IsolationMode: scan ENV{SPRING_DATADIR} &amp;amp; config&#039;s SpringData as readonly datadirs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; using now OS functions to expand special paths in spring&#039;s include dirs (config&#039;s SpringData, ENV{SPRING_DATADIR}, ...)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span class=warning&amp;gt; Windows: now uses windows syntax (&amp;quot;$HOME/foo/bar&amp;quot; is now &amp;quot;%HOME%/foo/bar&amp;quot;) (see msdn&#039;s ExpandEnvironmentStrings documentation)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; Linux: now supports full bash path syntax (&amp;quot;~/&amp;quot;, &amp;quot;${HOME}/.spring/&amp;quot;, &amp;quot;/foo/../bar/&amp;quot;, etc.) (see manpage of wordexp)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove &amp;quot;Start SpringSettings&amp;quot; and &amp;quot;Start the Lobby&amp;quot; from the test/develop menu&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; remove support for selectionkeys.txt&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add internal_pthread_backtrace for freebsd&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; update mingwlibs (fixes rotated textures)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; make globalLOS a per-allyteam variable&amp;lt;br&amp;gt;/globallos &amp;lt;n&amp;gt; --&amp;gt; toggle for allyteam &amp;lt;n&amp;gt;, no argument --&amp;gt; toggle for all&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pathing==&lt;br /&gt;
*&amp;lt;span&amp;gt; QTPFS:&amp;lt;br&amp;gt;fix several minor issues and corner cases&amp;lt;br&amp;gt;support partial searches, allow search to start from blocked nodes&amp;lt;br&amp;gt;tweak heuristic so it overestimates less on non-flat terrain&amp;lt;br&amp;gt;do not let units move before path-request is processed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; UnitDef: add turnInPlaceAngleLimit tag&amp;lt;br&amp;gt;for a unit with turnInPlace=true, defines the&amp;lt;br&amp;gt;maximum angle of a turn above which it starts&amp;lt;br&amp;gt;to brake (defaults to 0.0, values in degrees)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MoveDef:&amp;lt;br&amp;gt;unhardcode default pathfinder cost-adjustment and&amp;lt;br&amp;gt;speed-multipliers for squares blocked by *mobile*&amp;lt;br&amp;gt;units:&amp;lt;br&amp;gt;avoidMobilesOnPath = boolean,&amp;lt;br&amp;gt;speedModMults = {&amp;lt;br&amp;gt;mobileBusyMult = number,&amp;lt;br&amp;gt;mobileIdleMult = number,&amp;lt;br&amp;gt;mobileMoveMult = number,&amp;lt;br&amp;gt;}&amp;lt;br&amp;gt;unhardcode the DepthMod equation:&amp;lt;br&amp;gt;depthModParams = {&amp;lt;br&amp;gt;minHeight      = number,&amp;lt;br&amp;gt;maxHeight      = number,&amp;lt;br&amp;gt;maxScale       = number,&amp;lt;br&amp;gt;quadraticCoeff = number,&amp;lt;br&amp;gt;linearCoeff    = number, -- deprecates &amp;quot;depthMod&amp;quot;&amp;lt;br&amp;gt;constantCoeff  = number,&amp;lt;br&amp;gt;}&amp;lt;br&amp;gt;new formula is given by&amp;lt;br&amp;gt;if h &amp;lt; depthModParams.minHeight: 1.0&amp;lt;br&amp;gt;if h &amp;gt; depthModParams.maxHeight: 0.0&amp;lt;br&amp;gt;else:&amp;lt;br&amp;gt;depthScale = MAX(0.01, MIN(depthModParams.maxScale, (a * h * h) + (b * h) + c))&amp;lt;br&amp;gt;depthMod = 1 / depthScale&amp;lt;br&amp;gt;where&amp;lt;br&amp;gt;h = unit&#039;s absolute height below water surface&amp;lt;br&amp;gt;a = depthModParams.quadraticCoeff&amp;lt;br&amp;gt;b = depthModParams.linearCoeff&amp;lt;br&amp;gt;c = depthModParams.constantCoeff&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; reload IsolatedMode &amp;amp; Dir via the EnvVar on Init() calls&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; warn about invalid version numbers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add python bindings for unitsync&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MacOSX==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix signal handling&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use native DialogBoxes&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; cleanup and extend SSMF shader, now includes a parallax-mapping stage&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; add LuaRules callin `DrawShield(number unitID, number weaponID) --&amp;gt; boolean`&amp;lt;br&amp;gt;(true skips Spring&#039;s own drawing of shield &amp;lt;weaponID&amp;gt; owned by unit &amp;lt;unitID&amp;gt;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make LuaUnsyncedCtrl::SendSkirmishAIMessage return a table, not N loose strings&amp;lt;br&amp;gt;(but note there is nothing in this table due to &amp;quot;limitations&amp;quot; of the AI interface)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add weaponDefID parameter to ProjectileCreated&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add facing parameter to AllowUnitCreation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove most range-checks in default gadget-handler for registering commands (2930+2952)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; distinguish damage-types for Unit{Pre}Damaged when weaponDefID &amp;lt; 0 (2966)&amp;lt;br&amp;gt;weaponDefID -1 --&amp;gt; debris collision&amp;lt;br&amp;gt;weaponDefID -2 --&amp;gt; ground collision&amp;lt;br&amp;gt;weaponDefID -3 --&amp;gt; object collision&amp;lt;br&amp;gt;weaponDefID -4 --&amp;gt; fire damage&amp;lt;br&amp;gt;weaponDefID -5 --&amp;gt; kill damage&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed Intel GPU detection under Windows&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed handling of duplicated used hotkeys (i.e. unit groups &amp;amp; specteam switching)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed minor issues with ground collision RayTracing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed compilation with boost &amp;gt;=1.48&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed Spring.Restart&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; open logfiles on win32 with commit flag set&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; don&#039;t allow spring to start when a depend file is missing&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Rapid unit ejection from factory&amp;quot; (2864)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Units walk in circles on their way to a far awar move goal&amp;quot; (2866)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Excessive movement bouncing off buildings and wreckages&amp;quot; (2865)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;armpw stuck in air while pathing around solars&amp;quot; (2854)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Enemied units can get stuck in each other with movectrl&amp;quot; (2832)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;A factory set to wait continues the queue&amp;quot; (2868)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Change in Factory Behaviour wrt AllowUnitCreation&amp;quot; (2873)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Building with Meta-Key pressed does not work&amp;quot; (2764)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;&#039;Move at slowest speed of group&#039; move order (ctrl+alt) semi-permanently changes unit maxvelocity.&amp;quot; (2880)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; BeamLasers could hit but not damage units using per-piece colvols&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; heap corruption in UnitDrawer::ShowUnitBuildSquare (2903)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; heap corruption in TransportCAI::UnloadDrop (2911)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; mismatched feature colvol matrices&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MoveCtrl.SetRelativeVelocity&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; bug in TestTrajectoryCone for ballistic weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; transported units being unhittable (2875, 2934)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SetUnitCrashing inconsistency, caused &amp;quot;Aircraft crashing while landed results in irregular behavior&amp;quot; (2924)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; obscure targetting bug, caused &amp;quot;Gunship jams when on hold fire&amp;quot; (2406)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; deprecate / remove the &#039;toAirWeapon&#039; WeaponDef tag&amp;lt;br&amp;gt;(use &amp;quot;onlyTargetCategory = VTOL&amp;quot; for the same effect)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &#039;airmesh is 0 at x &amp;gt;= width or z &amp;gt;= height&#039; (2938)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GuiHandler crash when unit has no valid selfDExplosion (2852)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;lt;canSubmerge=false, floater=true&amp;gt; aircraft landing on sea floor (2856)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &#039;waterweapon=false BeamLaser can fire into water&#039; (2857)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; the units-humping-obstacles syndrome (forward and reverse)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; silly aircraft refueling bugs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &#039;Warning message on SetGroundMoveTypeData(unitID, &amp;quot;maxSpeed&amp;quot;, 0)&#039; (and some related possible div0&#039;s)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; weird inability of weapons with a non-default onlyTargetCategory to attack the ground&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &#039;Unit LOD billboards are too dark&#039; (2948)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rare antinuke bug (2956)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; typo in setting of default turnInPlaceSpeedLimit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;All terrain units move commands are removed when climbing cliffs&amp;quot; (2958)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &#039;Landed gunships do not follow height reduction&#039; (2823)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=85.0=&lt;br /&gt;
==Major Changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; ROAM \o/&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; QTPFS (disabled by default)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CommandLine==&lt;br /&gt;
*&amp;lt;span&amp;gt; updated man-pages&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added new argument `--sync-version` (i.e. prints &amp;quot;85&amp;quot; for a 85.0 build or &amp;quot;84.0.1-567-g69ef7a3 develop&amp;quot; for a dev build)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow to build proper release builds without being on branch master&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a full set of new arguments to spring-dedicated (see `spring-dedicated --help`)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added --isolation &amp;amp; --isolation-dir arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; optionally, you may supply a path with SPRING_ISOLATED=&amp;lt;isolation-mode-dir&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; added ROAM. Kudos go to B. Turner (the original author of the code) and Beherith (for integrating it into Spring).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; set SmoothLines &amp;amp; SmoothPoints by default on DONT_CARE (so your gfx driver settings decide if it is enabled or not)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; dynamic viewrange handling, so even a 32x32 map can be rendered w/o clipping in low camera angles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; log available video memory on NVidia/ATi gfx drivers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disable GLSL shaders on Mesa/Intel drivers&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal/Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; re-added forced log file flushing when handling crashes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; made the (new) C++ AI Wrapper VS compatible&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; name threads so you can identify them in `htop` (Linux only)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some additional time-profilers in rendering code&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; hide &amp;quot;(Headless)&amp;quot; in dedicated&#039;s returned version name&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed stacktrace translation with some Linux setups&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when specs are cheating in via /team&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix transport loading failure&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==(G)UI==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix keyshortcuts (handle F3 OR any+F3 but not both at once!)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix EndGameBox&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make F2 colors less ambiguous&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; the ManualFire action now expects a cursor &amp;quot;cursormanfire&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sim==&lt;br /&gt;
*&amp;lt;span&amp;gt; make units crushable like features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; implement avoidFeature for Cannons and MissileLaunchers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix extremely fast unit rotations after being hit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix FPS-mode range exploit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix teleport-to-smooth-mesh after unloading&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pathing/MoveType==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units sometimes moving onto impassable squares&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix the mass-clumping unit movement bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; properly restore MoveType::maxSpeed after a guard-order&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent units getting stuck when turning around the corner of other units&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CEG==&lt;br /&gt;
*&amp;lt;span&amp;gt; give warning when textures used in SimpleParticles don&#039;t exists&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; really fix default projectile colors&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MultiThreaded (GML)==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix hang/runtime error during pathing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Creating unit in gadget:Initialize()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; lots of other fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
*&amp;lt;span&amp;gt; limit UnitReplies to max one concurrent playback&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; play most unit sounds (activate, ...) only if unit is in LOS&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UnitDef==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; removed &amp;quot;commander&amp;quot; tag (The Commander selectkeys filter is now defunct (ctrl+c hotkey). Lua it, or add a new one that looks for any canManualFire units.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added new &amp;quot;blocking&amp;quot; bool tag&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; &amp;quot;canDGun&amp;quot; is now a synonym for &amp;quot;canManualFire&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added new tag &amp;quot;crushResistance&amp;quot; (defaults to unit&#039;s mass)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; make the default cloakCost* values 0 instead of -1,&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; added new &amp;quot;canCloak&amp;quot; bool tag (If an unit can receive user cloak commands. Before, canCloak was auto set to true if cloakCost &amp;gt;= 0.)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FeatureDef&lt;br /&gt;
*&amp;lt;span&amp;gt; added new tag &amp;quot;crushResistance&amp;quot; (defaults to feature&#039;s mass)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WeaponDef==&lt;br /&gt;
*&amp;lt;span&amp;gt; added new &amp;quot;craterAreaOfEffect&amp;quot; float tag (defaults to the value of areaOfEffect)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==modrules.lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;movement.allowCrushingAlliedUnits&amp;quot; (default false)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;movement.allowUnitCollisionDamage&amp;quot; (default false)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;system.pathFinderSystem&amp;quot; (defaults to 0, 1 is QTPFS)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; UnitDef[].isCommander returns now false&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed Spring.GetTimer/DiffTimers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed Spring.SetMouseCursor when using hw cursor&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; handle Lua code crashes in some events correctly, so they don&#039;t crash the whole Lua enviroment (fixes: &amp;quot;LuaRules::CheckStack top = -1&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; call UnitMoveFailed event only for via Script.SetWatchUnit registered UnitDefs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=warning&amp;gt; added new WeaponDefs[].craterAreaOfEffect&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; extend Spring.SetUnitBlocking with an optional 4th &amp;quot;crashable&amp;quot; bool argument&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added new Spring.GetUnitBlocking(unitid) -&amp;gt; blocking, crushable&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==demo widgets==&lt;br /&gt;
*&amp;lt;span&amp;gt; minimap_startbox.lua: play sound when start-positions are placed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Buildbot==&lt;br /&gt;
*&amp;lt;span&amp;gt; create spring_${VERSION}_minimal-portable+dedicated.zip&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UnitSync==&lt;br /&gt;
*&amp;lt;span&amp;gt; if Init() is called, but we are already initialzied, do a re-initialization&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=84.0=&lt;br /&gt;
==Bugfixes &amp;amp; Improvements==&lt;br /&gt;
*&amp;lt;span&amp;gt; reduced &#039;Got invalid Select&#039; message spam&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; hide framNums from chat console&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed command queue bug (zombie builders)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; always flush stdout/stderr&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; workaround a SDL bug with X11 &amp;amp; fullscreen that broke MiddleClickScrolling&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; changed target behavior of enemies outside of LOS&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed BumpWater with DepthBufferBits=16&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed aircraft landing on repairpads&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reset aircraft state after starting from repairpad (`ground hover bug`)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make UHM available before the gamestart (fixes Spring.GetGroundHeight in :Initialize() etc.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; workaround &#039;Bertha&#039; issue (UHM related)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make C++ AI Wrapper compile with VS&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed fog in some shaders&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed F2 view&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improve weapon interceptors (anti nukes can now intercept nukes that fly over them)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed free resources by NanoFrameDecay&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; handle resigned players (:= /spectator) in game_end.lua gadget&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Lua Spring.KillTeam: disallow killing of Gaia (engine doesn&#039;t support so atm)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed lasers not hitting targets at edge of range&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed stutter with low-reloadtime weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Lua: removed WeaponDefs[i].graphicsType &amp;amp; renamed WeaponDefs[i].hardStop -&amp;gt; WeaponDefs[i].laserHardStop&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=83.0=&lt;br /&gt;
==Major Changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; EFX/EAX support (sound reverb)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ASSIMP support (not 100% finished yet)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AI Interface pure-ification&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; many speedups and double as much slowdowns&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use a new engine versioning scheme (RC12)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; use more smooth algorithm for wind updates&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed a few focus lost issues (keyboard &amp;amp; mouse)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; DebugMode now draws feature collision volumes too&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; made ShadowSpace linear&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; multithreaded loadingscreen&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; hide out-of-LOS heightmap changes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; replace engine start point marker with lua-widget&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use &amp;quot;game&amp;quot; instead of &amp;quot;mod&amp;quot; in many places&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add &amp;quot;isolation&amp;quot; mode (do not use global data-dirs)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; change lobbyserver main address to &amp;quot;lobby.springrts.com&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use http://springrts.com/ everywhere (deprecate clan-sy links)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ArchiveMover uses unitsync to detect the writable data dir&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improve version logging on non-Windows OSs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; include player-name in log message when resingning&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add `../` as data-dir if it contains `maps/`, `games/` and `engines/`&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow to define the default config- nad data-dir on windows, using env var PROGRAMDATA&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; refuse to load too heavily compressed archives (see 0.82.3-1043-g2c15040 commit message for details)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; better IP v6 and v4/v6 mixed mode support&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; lots of error messages improved and new ones added&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add the first few unit-tests&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add a validation-test&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add network bandwidth limits per player to prevent malicious command spam&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add optional high-loss network modes to make spring playable on very lossy connections (NetworkLossFactor = 0|1|2)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; too many to list, see http://springrts.com/mantis/changelog_page.php (incomplete!)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; calculate the team unit-limit without ancient hacks&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; stop the maxunits team restriction from applying to Gaia (#2435)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix ray-ground intersections when camera is outside map&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix spring on MacOSX&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; CMake configure and make build are much more stable now (no more failure due to wrong order of actions)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix DamageArray related sync error&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix a lot of memory-leaks&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix unit does sometimes not reach target position when given a restore command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent build time-out when builder or other units are blocking the build pos&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix &amp;quot;cheat&amp;quot; status disparity between server and client after watching demo&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix captured unit still getting shot at&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix repeat commands remain even if the target object is destroyed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix unwanted error spam when disconnecting from server&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix reconnect failure (incorrect password)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix rare desync and keyframe mismatch after reconnect&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix two crashes related to audio channels&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; eliminate some false hang detections on load&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix multithreaded crash in lua material rendering&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix hang after crash&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix memory corruption in bitmap handling&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix desync in PieceProjectile (#2591)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix a certain /take exploit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix hover aircraft may become unresponsive in conjunction with command chains and repeat enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / misc defs==&lt;br /&gt;
*&amp;lt;span&amp;gt; replace UnitDef::pieceTrailCEG* by a Lua subtable of sfxTypes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; deprecate several *Def tags and their Lua*Defs copies (type/maxSlope/isBuilder/canDGun/transportableBuilding/dropped/canCrash/...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make a missing UnitDef::humanName non-fatal&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; UnitDef: remove hardcoded: if ((waterline &amp;gt;= 5.0f) &amp;amp;&amp;amp; canmove) { waterline += 10.0f; }&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make UnitDef::losHeight configurable instead of an unused hardcoded value&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add collide{Enemy, Ground} as weapondef tags&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use a more reasonable default for FeatureDef.autoreclaimable (== reclaimable)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; scan in &#039;effects/&#039; as well as &#039;gamedata/explosions&#039; for CEG definitions&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / misc commands==&lt;br /&gt;
*&amp;lt;span&amp;gt; add a /clearmapmarks command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rename /advshading to /advmodelshading; add an /advmapshading analogue&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add &#039;/reloadCEGs [cegtag]&#039;; reloads all CEGs or one specific CEG by tag&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add &#039;/dumpstate &amp;lt;minFrame&amp;gt; &amp;lt;maxFrame&amp;gt; [frameInt]&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add &#039;/CommandList&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add &#039;/CommandHelp &amp;lt;commandName&amp;gt;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more complete word completion for game-commands&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make auto-host command `paused` use a parameter (0|1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add scrollbars for player list in &amp;quot;quit&amp;quot; and &amp;quot;share&amp;quot; dialogs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Userconfigs==&lt;br /&gt;
*&amp;lt;span&amp;gt; removed the &amp;quot;FSAA&amp;quot; config tag (FSAALevel is enough)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed default 1024x768 res and use desktop one now instead (done when X/YResolution &amp;lt;= 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a new 3rd state for AtiHacks: -1 (autodetect each run, so you can switch GPUs)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; never allow zero-area feature footprints&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove radius halving for default aircraft collision-volumes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; close down another out-of-map attack exploit route&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rewrite collision detection/resolution between ground units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; skip path-estimating for unused MoveDefs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use the full resolution of the blocking object map in pathestimator&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; invoke higher resolution pathfinder if needed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; always add the &amp;quot;geovent&amp;quot; FeatureDef (#2402)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; only send UnitLoaded events for units that were not already being transported (when Attach&#039;ing them)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bizarre skidding behavior for ground units with non-zero slideTolerance&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; higher priority for nano particles when capturing and reclaiming other teams units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; print error message for select commands referencing invalid object IDs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make TorpedoLauncher weapons able to target any in-water unit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make pushing of enemy units during collisions a ModInfo option (&amp;quot;allowPushingEnemyUnits&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove hardcoded enter-crashing-state-on-death behavior for aircraft (now delegated to Lua or COB)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Map==&lt;br /&gt;
*&amp;lt;span&amp;gt; merged both mapinfo.lua&#039;s! before there were two, one in the base-dir (-&amp;gt; ArchiveScanner) and one in &amp;quot;maphelper/mapinfo.lua&amp;quot; (-&amp;gt; MapParser/MapInfo)&amp;lt;br&amp;gt;engine now always tries to read the base-dir one&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new mapinfo.lua tags:&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; &amp;quot;specularExponent&amp;quot; (moved from userconfig)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; &amp;quot;fogEnd&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; &amp;quot;bladeColor&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; check for the smt _next to_ the smf (which can already freely placed in the archive!)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow resources_map.lua to specify GroundFX textures for CEGs (that use CSimpleGroundFlash)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; Lua-scriptable dynamic lighting of models and terrain (www.youtube.com/watch?v=H5je8TKDfNA)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; WIP DynamicSun option for moving shadows&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add optional SSMF normal-mapping and self-illumination stages&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix holes in shadows cast by non-closed S3O/OBJ models icw. face culling&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; always cull (non-3DO) model backfaces for the shadow pass&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; squeeze some extra precision out of the shadow-map&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make map/model/tree/projectile shadows individually configurable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow weapons to not leave any explosion scars (add &amp;quot;explosionScar=true|false&amp;quot; to a WeaponDef)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; render all SMF maps through GLSL if it is available&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make depth-testing and -masking configurable for CSimpleGroundFlash&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix mixed up textures in the multithreaded version&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix awkward performance with multithreaded engine in games using custom model formats&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add peak display for time profiler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t display /mtinfo if the value is near zero&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; properly fade out features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make underwater shadows darker in deeper water&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; significantly reduced performance impact for Lua rendering widgets in the multithreaded version&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; enable creation of OpenGL objects such as display lists in the sim thread in the multithreaded version&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix BumpWater on ATI cards when atiHacks=false&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Sound==&lt;br /&gt;
*&amp;lt;span&amp;gt; added EFX/EAX support (reverb)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; /tset UseEFX [0|1]&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; /tset snd_filter %gainlf %gainhf&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; /tset snd_eaxpreset &amp;quot;bathroom&amp;quot; (see EFXPresets.cpp for alternatives)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed a bug when runtime changing the volume&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a warning when trying to play a non-mono sound in 3d (OpenAL doesn&#039;t support this!)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / COB&amp;amp;LUS==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed bug in WaitFor... [mantis #2499]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; minor animation-handler optimizations&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed &amp;quot;/luagaia xyz&amp;quot; cmds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added EAX/EFX funcs: Spring.[Get|Set]SoundEffectParams&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; totally remove following args of SetUnitPieceCollisionVolumeData: affectLocal, affectGlobal, enableGlobal (it&#039;s now always local!)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed gl.PushAttrib(GL.ALL_ATTRIB_BITS)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a new channel argument to Spring.PlaySoundFile(). it is always the last argument (independent if you defined pos/speed)&amp;lt;br&amp;gt;it can either be:&amp;lt;br&amp;gt;&amp;quot;battle&amp;quot;, &amp;quot;sfx&amp;quot;, 1&amp;lt;br&amp;gt;&amp;quot;unitreply&amp;quot;, &amp;quot;voice&amp;quot;, 2&amp;lt;br&amp;gt;&amp;quot;userinterface&amp;quot;, &amp;quot;ui&amp;quot;, 3&amp;lt;br&amp;gt;anything else defaults to &amp;quot;general&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed teamcolors.lua (redundant since Spring.SetTeamColor)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add optional flattenGround parameter to Spring.CreateUnit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove the &amp;quot;n&amp;quot; field from array-like tables returned by API functions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.GetProjectilesInRectangle&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; linked Projectile{Created, Destroyed} to the Spring.SetWatchWeapon state&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.SetWatchUnit(unitDefID) and Spring.SetWatchFeature(featureDefID) analogues of SetWatchWeapon&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; extend LuaPathFinder with support for setting node cost overlays&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; extend SyncedRead::Pos2BuildPos: add support for additional param &amp;quot;facing&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.{Get, Set}MapSquareTexture (these allow complete dynamic run-time retexturing of SMF maps)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.GetMetalMapSize (returns size in metal map coordinates)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.GetMetalExtraction (note: uses metal map coordinates)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.{Get, Set}MetalAmount (note: uses metal map coordinates)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.GetFeaturesInCylinder&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.GetFeaturesInSphere&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.GetFeatureCollisionVolumeData&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.SetWMIcon&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.SetWMCaption&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.ClearWatchDogTimer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added widget call-in GamePaused&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added widget call-in PlayerAdded&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added widget call-in PlayerRemoved&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added callins for collision events&amp;lt;br&amp;gt;UnitUnitCollision(colliderID, collideeID) -- needs SetWatchUnit enabled for both parties&amp;lt;br&amp;gt;UnitFeatureCollision(colliderID, collideeID, crushKilled) -- needs SetWatchFeature enabled for both parties&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.SetUnitCrashing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add All/None buttons for widget selector&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix multithreaded crashes in Spring.Get{Full,Real}BuildQueue&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Immobilebuilder fails near the map edge&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Spring.SetUnitWeaponState &amp;quot;range&amp;quot; for cannon weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add control over airStrafe via MoveCtrl.SetGunshipMoveTypeData&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; migrate MoveCtrl.SetLeaveTracks to (LuaUnsynced) Spring.SetUnitLeaveTracks&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed all widgets (moved to examples/Widgets)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Internal==&lt;br /&gt;
*&amp;lt;span&amp;gt; added limited OpenMP support&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added multithreaded OpenGL support via offscreen contexts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added LinkingTimeOptimization (currently fails with GCC4.5/6)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more/better error reporting&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new logging system:&amp;lt;br&amp;gt;frontend is leightweight&amp;lt;br&amp;gt;frontend is C compatible&amp;lt;br&amp;gt;is more modular&amp;lt;br&amp;gt;supports log levels: DEBUG, INFO, WARNING, ERROR, FATAL&amp;lt;br&amp;gt;&amp;quot;sub-systems&amp;quot; renamed to &amp;quot;sections&amp;quot;&amp;lt;br&amp;gt;more section then before&amp;lt;br&amp;gt;is compatible with unit-testing&amp;lt;br&amp;gt;write DEBUG and INFO to stdout, the rest to stderr&amp;lt;br&amp;gt;disable console logging for unitsync&amp;lt;br&amp;gt;disable console output for dedicated server shared library&amp;lt;br&amp;gt;turn off flushing to log-file completely&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added GL_ARB_debug_output support (callback-based opengl error reporting)&amp;lt;br&amp;gt;NOTE: this doesn&#039;t work yet, because most drivers export this ext only for so called debug contexts.&amp;lt;br&amp;gt;Creating those is impossible with near all current GL frameworks (SDL, SFML, ...).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed unnecessary memory allocation in Archive7Zip&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; promote the CrashHandler hang-detector thread to a WatchDog&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use a SafeVector for the Command parameter array&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; lots of cleanup and refactoring&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; get rid of goto&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; modularized chat-/game-commands (for example /cheat)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; no more use of AUX_SOURCE_DIRECTORY in CMake (as recommended by CMake team)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Remove the obsolete SCons build system&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduces constantly allocated memory for drawing stuff for AIs from ~130MB to ~ 2KB&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add a new build-target &amp;quot;generateSources&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow to use a system-supplied minizip library&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow to disable each build type individually at configure stage&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; generate version from git-describe (git tags), instead of hardcoding them into a source-file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; unsynced deletion of synced projectiles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; watchdog monitoring for some additional threads&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; AI Interface pure-ification, see Forum: Development - AI - &amp;lt;sticky-thread&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add full two-way communications between AI&#039;s and unsyced Lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; let AI&#039;s send textual commands (like &amp;quot;/cheat&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow AI Interface plugins to provide info about available Skirmish AIs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; install Java-AIInterface and JavaOO-AIWrapper as maven artifacts into the local repository&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Legacy C++ AI: allow fetching the maximum number of units in a game&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix source generation occasionally failing for Java-AIInterface&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; treat allied units as always in LOS&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fetch the correct UnitDef for decoy units, if the unit is allied&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Java AI Interface: pack native sources too&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Maven-ize NullOOJavaAI&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Java AI: allow AIs to support compiling only through Maven&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; generally improved Maven support&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make source generation compatible with BWK and GAWK 4.0.0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; E2323AI: bump to latest version&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: mid-game init fix&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: prevent stack corruption in the case of file paths longer then 500 chars&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI: do not use a single/static team-instance callback in a place used by all RAI instances&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; implemented GetDataDirectoryCount() and GetDataDirectory(int index)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add support for retrieving non-string info value types (string, integer, float, bool)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; introduce GetPrimaryModInfoCount&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix OpenArchiveFile&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; create minimal-portable .7z version of engine and reuse it in installer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ai&#039;s are now installed always (removed individual sections)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add registry key to unitsync.dll HKLM\Software\Spring\SpringEngineHelper&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; replace readme.html with http://springrts.com/wiki/Read_Me_First&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.82.7.1=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; disable frame number prefix in messages to the console by default&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add temporary hack to not crash on HostIP=localhost&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; change parameter `useOverlay` from type number to bool in config access functions&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Auto-Hosts==&lt;br /&gt;
*&amp;lt;span&amp;gt; gracefully exit if the autohost is not reachable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; if the local socket supports IP v6, but AutohostIP is specified as IP v4, use v4 to connect&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; stop server on config problem&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Dedicated-Server==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when game ends prematurely&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; add new function GetSpringVersionPatchset() (return &amp;quot;1&amp;quot; for a spring version of &amp;quot;0.82.7.1&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove accidentially added third paramter to Init()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix: do not check for running .exe in silent-mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Zero-K: desktop-shortcut: rename &amp;amp; add icon&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: add missing initialization checks&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.7=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash due to invalid lastAttacker&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not bind a UDP socket for local games -&amp;gt; allows multiple local instances again sans hassle)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; clamp minimum mapHardness to 0.001 to prevent div/0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix dangling CUnit* (crash for everyone in-game)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash in 3DO Parser&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bug in CGround::TrajectoryGroundCol with outside map coordinations&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent memory-leak in LoadGrayscale() if there already was pixel-data&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some more memory-leaks&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent equal unsynced random seeds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix SetUnitRotation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix enemy units responding to bugger off&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; apply damage wrt. impacted piece if usePieceCollisionVolumes == 1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make CBitmap::ReverseYAxis() more efficient&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove excess elements from BasicMapDamage::craterTable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rename &amp;quot;mod&amp;quot; to &amp;quot;game&amp;quot; in default menu &amp;amp; add &amp;quot;games/&amp;quot; to mod scanDirs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; implement host-definable IP&#039;s&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not save/restore minimized windows state on win32&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; convert some crashes because of invalid CEGs into warnings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; properly ignore non-blocking objects during collisions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; change minimum for UnitDef.buildDistance from 128 to 38 (default stays 128)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; broadcast team died events to all players, so it is stored in the demo file&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Logging==&lt;br /&gt;
*&amp;lt;span&amp;gt; give S3O model name in error message when a texture is missing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; print name of widget to infolog.txt before it starts to load&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent empty content_error messages&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; catch model content_error exceptions ASAP&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; unify stdout/infolog output&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix global enviroment pollution in luaui.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow Spring.AssignMouseCursor &amp;amp; Spring.ReplaceMouseCursor from LuaRules, too&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow loading from subfolders for weapon-def files (tdf and lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; implement Lua&#039;s GameFrame event via the EventHandler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added parameter includeSky to TraceScreenRay&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; correct `AllowResourceTransfer` params in default gadget handler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new parameter for LuaSyncedCtrl::SetUnitArmored allows setting of the armor multiple&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Path-Finder==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units-stuck-behind-terrain&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Godde-III&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not assign extra waypoints to aircraft&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; decrease ETA-failure response time&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; keep speed above UnitDef::turnInPlaceSpeedLimit when turning (if turnInPlace==0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units slowing down on negative slopes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; set a more reasonable default turnInPlaceSpeedLimit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; PFS: remove circular constraint from run-time searches&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; set a more reasonable turnInPlaceSpeedLimit&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix cannon visuals&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix rendering of tri-stripped S3O&#039;s&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; require GLEW 1.5.1+ because 1.5.0 does not have `glMapBufferRange`&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not crash on shader compilation error&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix build-order drawing for OBJ models&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; replace 63x63 icons with 64x64 ones in LuaUI/Icons/ (prevents glitches on some older GFX cards)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix occasionally strange wake SFX&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Auto-Hosts==&lt;br /&gt;
*&amp;lt;span&amp;gt; builds other then dedicated-server now also support commands &amp;quot;kill&amp;quot; and &amp;quot;pause&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make command `paused` support a parameter (0|1)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Dedicated-Server==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix binary name&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Head-Less==&lt;br /&gt;
*&amp;lt;span&amp;gt; crash fix&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; remove of &amp;quot;jump depending on uninitialized value&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; LegacyCpp-AIWrapper: fix some memory leaks&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: fix memory corruption (one-character-typo...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: clamp costs to 1.0, not to 0.0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: compile fix for 64bit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: fix infinite loop&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: do not access invalidated pointer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: init value before use&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: prevent accessing of array at position -1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: prevent a crash when enemy unit is out of map bounds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: fix mid-game init&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: add version independent config file (by azaremoth) for _The Cursed_ game&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI: made compatible with MSVC&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI: fix cache file names&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI: fix AI considering water as harmful&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI: fix building non suitable buildings on certain maps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI: fix a crash at end of game&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI: pump to version 3.25.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Stack-Trace-Translator==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed for main binary (.exe, windows)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; do not check for .Net when installing Zero-K&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; delete all files that were installed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Tobis rapid client&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.6.1=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent false hang detection trigger&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix occasional ATI crash&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; rename SpringDownloader to Zero-K Lobby&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; re-add MSVCR71.dll&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.6=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix various bugs related to mid-game join&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix LosHandler ignoring units with losRadius &amp;lt;= 0 but airLosRadius &amp;gt; 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix a leftover icon bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix BFGroundDrawer crash at extreme view-distances&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix death-wait&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow death-wait in games with more then 2 ally teams&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduce risk for deadlock during stack trace&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow to specify game-start-delay in the start script (GameStartDelay)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent SEGV when updating skidding units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improve turnInPlace=0 path-following (#2072)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; units ignored ETA failures when &amp;lt;= 200 elmos from goal, even if goal unreachable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make pushResistant (allied) units still move out of the way of constructions&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; update the displayed resource production for inbuilt units too&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix spectators see ghosted buildings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not draw icons for noDraw units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not cast shadows for noDraw units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not draw healthbars for noDraw units either&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; add feature-ID trace-ray command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow fetching of other teams resources (current, income, usage, storage)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; EnableCheatEvents() was a no-op because it did not enable cheats temporarily&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; IsUnitInLosOrRadarOfAllyTeam() now considers gs-&amp;gt;globalLOS&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt;&amp;gt; UnitCreated now may trigger EnemyCreated for non-cheating AI&#039;s&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI: new version: 3.22.4&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Python AI Interface: removed a few memory leaks&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix mapname/mapfilename conflicts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; add portable install option (default: disabled)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add Python AI Interface to the windows installer&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Repository==&lt;br /&gt;
*&amp;lt;span&amp;gt; remove SelectionEditor&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.5.1=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix FPS/direct controlling crash&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / multi-threaded==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix unit icons/healthbars crash&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI: NOTA and XTA support enhanced &amp;amp; lots of improvements&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.5=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; draw icons for cloaked units again&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix NaNs if map hardness is zero&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lua&lt;br /&gt;
*&amp;lt;span&amp;gt; fix UnitPreDamaged Lua CallIn&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: do not crash on game end if mod did not spawn a commander in the first 450 frames&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI: lots of fixes &amp;amp; support for NOTA &amp;amp; Conflict Terra and AI options&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.4=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix demo desyncs if commands were issued during pause&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix abnormal demo speed (during reconnect and temporary lags)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix demo runs away from local user&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix mid-game join&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix FullScreen mode under Linux&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix KDE/GNOME detection for error message box&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix another FPU reset in LuaLobby&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t reload defaults each time /ctrlpanel command is used (behaves now the same way as /cmdcolors)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; speed up reflection pass a little&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disable heatmapping by default&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix COB&#039;s KILL_UNIT for self-kills&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix bugged default-argument passing in path-follower&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix broken return-value handling for UnitPreDamaged&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; OBJParser: deal with carriage returns&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix holdSteady (and sweeping beamlaser) rotations&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix SEGV when /give&#039;ing features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when linking grass shaders on non GLSL system&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix specs do not see all features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Projectiles do not show up for missile weapons or torpedoes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash on bad playername message&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disable team highlighting for spectators by default&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lua&lt;br /&gt;
*&amp;lt;span&amp;gt; fix incorrect ClipPlanes in DrawInMinimap if gl.SlaveMiniMap is used&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix metal-maker widget&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash on capture from/by AI&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Python AI Interface&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI support version independent mod config files, for example BA.cfg&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Dedicated server==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix/re-add sync-check&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; possibly fix crash when sending data to improperly-connected autohost socket&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; add support for more then 16 start positions&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix checks for installed .Net version&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add SpringDownloader desktop shortcut&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix _make install-spring_ to work after initial configure&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix windows linking (related to -lws2_32)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Documentation==&lt;br /&gt;
*&amp;lt;span&amp;gt; updated man pages: spring &amp;amp; spring-dedicated&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new man pages: spring-headless &amp;amp; spring-multithreaded&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.3=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; rebuild because of stale base content packages&amp;lt;br&amp;gt;(different checksums between windows and linux)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix NullAI installing into /&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.2=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; miscellaneous OS X compile/link fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed incorrect handling of negative references in OBJParser&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed misinterpretation of the OBJ spec&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reorganized WindowState saving on exit on X&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed source package build&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; always print crash errors to infolog&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added i965_dri.so to OGL driver crash detection on Linux&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed autosharing resources to dead teams&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed units disappearing from quadfield after load-unload in transport&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed invalid FPU flags after LuaLobby connection is made&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed DrawFeature event&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.UnitScript.GetScriptEnv returns nil if the unit does not run a Lua script&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.GetCOBScriptID returns nil if the unit does not run a COB script&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed typo in mapdefaults.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; possibly fixed GetPlayerInfo&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; updated E323AI to latest version&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82.1=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed source package build&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed MT crash in DrawCommands&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed radar blips seen by spectators&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed dark metal spots in watert&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduced default value of max particles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; increased default LOD/icon distances&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; glFont::GetTextHeight &amp;amp; glFont::GetTextNumLines return now 0 lines for empty strings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed 3do shadows&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed minimap rendering in dualscreen modes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed laggy camera update with UnitTracker&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed seismic pings with incorrect size&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed incorrect highlight on end game screen&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; prevent units from becoming immobile zombies while maneuvering&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; base etaFailures limit on a unit&#039;s full-circle turning time&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; decrease etaFailures every frame we are not standing still&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed vibrating planes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed nanoframe being spawned while game is paused&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed slow response when releasing wait command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed the silly unit spinning ad-infinitum bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed unit occasionally not taking damage when it just left a transport&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed some awkward transport behaviour&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; properly deal with radars/jammers being transported&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed unit returning to pick up point when it dropped out of transport&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; skip waypoints that are behind a unit but within its turning circle&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; added a LuaRules DrawFeature call-in&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed LuaUnsyncedCtrl::SetWaterParams&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed Spring.Restart with Win 2k and OpenAL-soft&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaSyncedRead::GetUnitExperience: also returns limExperience now&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed obsolete engine options from EngineOptions.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Dedicated server==&lt;br /&gt;
*&amp;lt;span&amp;gt; use default visibility (hidden) for spring-dedicated under non-windows&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI: log files are now under _log/_ sub-dir&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: added config for BA 7.14&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI: added config for BA 7.14&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; made main part mandatory&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.82=&lt;br /&gt;
==Engine / General==&lt;br /&gt;
*&amp;lt;span&amp;gt; added HeadLess version of the engine (no graphics, no sound) by hughperkins&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; better overall handling of connection problems, with highlighting of uncontrolled units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; players in startscript may reconnect to a running game, even with changed IP address&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; players can choose server speed throttling algorithm by voting (/speedcontrol)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not crash on AI Interface error&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MT/GML: now a separate build target: make spring-multithreaded&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix linking under Fedora 13&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow choosing between available sound devices through config (snd_device)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add missing /skip variants to word completion&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use new dependency system for maphelper.sdz (by Beherith)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; OS X fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; hardcoded startscripts removed (Air Test, etc.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more default intercept types added&amp;lt;br&amp;gt;EmgCannon -&amp;gt; 1, AircraftBomb -&amp;gt; 8, Flame -&amp;gt; 16, TorpedoLauncher -&amp;gt; 32&amp;lt;br&amp;gt;LightningCannon -&amp;gt; 64, Rifle -&amp;gt; 128, Melee -&amp;gt; 256&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; engine does not spawn start unit anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; engine does not use StartUnit tag in sidedata.lua anymore (but still passes it to Spring.GetSideData)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; engine does not read `Script&#039; map tag anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; engine does not read `ScriptName&#039; modoption anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; engine does not deal with `StartMetal&#039; and `StartEnergy&#039; modoptions anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; pathfinder debugging views can be rendered now when spectating (and not cheating)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; dropped modinfo.tdf support (only modinfo.lua is supported now)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; clients now compare their path-cache CRCs and warn about differences instead of updating their running checksums with them&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring&#039;s CPU affinity can now also be set on non-win32 platforms, use the SetCoreAffinity ~/.springrc parameter as a bitmask&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; new unit tag: cloakTimeout, int, default 128 frames&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed the featureVisibility mod-option&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed calls to the engine path-finder to be sync-safe when run in unsynced context&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduced frequency of units ending up in &amp;quot;can&#039;t reach destination&amp;quot; situations&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed units not inheriting orders from factories and piling up (due to having their paths aborted)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed the TEDclassString UnitDef parameter (side-effect: hub-like units will break if they have a yardmap)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed diminishing metal makers option&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; changed the semantics of the holdSteady UnitDef tag&amp;lt;br&amp;gt;true ==&amp;gt; slave transportees to orientation of transporter attachment piece&amp;lt;br&amp;gt;false ==&amp;gt; slave transportees to orientation of transporter body (default)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed canDGun+commandfire to properly reproduce commander-like DGun behavior without script hacks&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Rendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed alpha-masked shadows for S3O models&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed ATI alpha masked shadows (trees, features)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed far-textures (caused changing teamcolors and disappearing units)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; support the OBJ model format (http://springrts.com/phpbb/viewtopic.php?f=9&amp;amp;t=22635)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; support specular lighting, multiple blendable detail textures, and sky reflections on SMF maps (&amp;quot;SSMF&amp;quot;)&amp;lt;br&amp;gt;http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=21951&amp;lt;br&amp;gt;http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=22564 (slightly outdated wrt. the SMD parameters)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; converted all shadow, tree, grass, model, and map shaders to GLSL&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; vertex-animated grass; maps can specify the grass blade- and shading-textures and the dimensions/angle for blades&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; refactored and abstracted unit/feature/projectile drawing to be format-agnostic&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; increased global decoupling between simulation and rendering code&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed model specular lighting (most visible on units)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; S3O model normals are now auto-scaled to unit-length&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; maps with mis-specified skybox textures will now load (without crashing Spring)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
*&amp;lt;span&amp;gt; use OpenAL Soft 1.11 under windows (was Creative)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; air-absorpion: absorb high frequencies when sound effects are far away (config-key &amp;amp; default value: snd_airAbsorption=0.1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; no-sound support through NO_SOUND compile time define or NoSound config-key&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; list of data-dirs for engine &amp;amp; unitsync are now always equal&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; API cleaned: no more void*, all structs deprecated&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; data dirs read from /etc/spring/datadir (separator is now &amp;quot;:&amp;quot; instead of &amp;quot; &amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FontRendering==&lt;br /&gt;
*&amp;lt;span&amp;gt; added a new inline ctrl command &#039;\008&#039; which resets the TextColor to the&amp;lt;br&amp;gt;color that was active when Print() got called, as in the following example:&amp;lt;br&amp;gt;font:SetTextColor(0, 0, 1); -- blue&amp;lt;br&amp;gt;font:Print(&amp;quot;\255\255\000\000red\255\000\255\000green\008blue&amp;quot;);&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaLobby:&amp;lt;br&amp;gt;callouts:&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Script.CreateLobby() -&amp;gt; userdata lobCon&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Connect(string url, int port)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Disconnect()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Login(string username, string password)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Rename(string newname)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:ChangePass(string oldpassword, string newpassword)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Register(string username, string password)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:ConfirmAggreement()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:JoinChannel(string chan_name [,string password])&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:LeaveChannel(string chan_name)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Say(string chan_name, string message)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:SayEx(string chan_name, string message)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:SayPrivate(string user_name, string message)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:StatusUpdate(bool ingame, bool away)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Channels()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:KickChannelMember(string chan_name, string user_name, string reason)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:ChangeTopic(string chan_name, string topic)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon:Poll()&amp;lt;br&amp;gt;callins:&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.DoneConnecting(bool sucess, string error_message)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ServerGreeting(string server_version, string spring_version, int udp_port, int mode)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.RegisterDenied(string reason)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.RegisterAccepted()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.LoginDenied(string reason)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.LoginEnd()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.Aggreement(string text)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.Motd(string text)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ServerMessage(string text)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ServerMessageBox(string text, string url)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.AddUser(string user_name, string country, number cpu)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.RemoveUser(string user_name)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.UserStatusUpdate(string user_name, bool away, bool bot, bool ingame, bool moderator, int rank)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ChannelInfo(string chan_name, int num_users)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ChannelInfoEnd()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.RequestMutelist(string chan_name)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.Mutelist(string chan_name, table {&amp;quot;userABC&amp;quot;,&amp;quot;userXYZ&amp;quot;,...})&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.Joined(string chan_name)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.JoinFailed(string chan_name, string reason)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ChannelMember(string chan_name, string user_name, bool joined)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ChannelMemberLeft(string chan_name, string user_name, string reason)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ChannelMemberKicked(string chan_name, string user_name, string reason)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ChannelTopic(string chan_name, string author, int time, string topic)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.ChannelMessage(string chan_name, string text)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.Said(string chan_name, string user_name, string text)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.SaidEx(string chan_name, string user_name, string text)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.SaidPrivate(string user_name, string text)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.Disconnected()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; lobCon.NetworkError(string message)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added a new los checking argument to Set..RulesParam()&amp;lt;br&amp;gt;e.g. new syntax is SetUnitRulesParam(int unitID, string paramName, float paramValue, { public = true } )&amp;lt;br&amp;gt;possible values for the table are:&amp;lt;br&amp;gt;`private` : only readable by the ally (default)&amp;lt;br&amp;gt;`allied`  : readable by ally + ingame allied&amp;lt;br&amp;gt;`inlos`   : readable if the unit is in LOS&amp;lt;br&amp;gt;`inradar` : readable if the unit is in AirLOS&amp;lt;br&amp;gt;`public`  : readable by all&amp;lt;br&amp;gt;note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it can read params with `inradar=true` even if the param has `inlos=false`)&amp;lt;br&amp;gt;note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied` and/or `public`&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Spring.GetUnitMetalExtraction(unitID) -&amp;gt; nil | number&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new synced Spring.ShareTeamResource(teamID_src, teamID_dst, type = [&amp;quot;metal&amp;quot;|&amp;quot;energy&amp;quot;], amount) -&amp;gt; nil&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Spring.GetTeamResourceStats(teamID, resourcetype = [&amp;quot;metal&amp;quot;|&amp;quot;energy&amp;quot;]) -&amp;gt; nil | used, produced, excess, recv, sent&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.SetProjectileMoveControl(number pid, boolean b) --&amp;gt; nil callout; if (b), makes all piece/weapon projectile movement fully Lua-controllable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improved Spring.GetTeamStatsHistory. It retuns now also the most recent data, not just the data of the cached stats which get updated only all 16 seconds.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed incorrect scaling in Spring.SetUnitResourceParam&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed Spring.GetAIInfo, it returned incorrectly the given teamID as first argument&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed a bug in Script.RemoveSyncedActionFallback&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added missing `coroutines` module and missing `select` function to unsynced LuaGadgets&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added os.setlocale to LuaUI&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Save/Load callins, both get a userdatum representing a save file as single argument&amp;lt;br&amp;gt;Save is unsynced, Load is synced (both gadget only)&amp;lt;br&amp;gt;Should allow implementing savegames mod side with less hacks&amp;lt;br&amp;gt;/reloadgame chat command added for development purposes, this fires the Load event again&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; modified base {armordefs|movedefs|sidedata}.lua to follow pattern of icontypes.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a ShieldPreDamaged call-in to LuaRules, triggered before any engine shield-vs-projectile logic executes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; UnitDefs[i].model.textures now actually contains the names of the model textures for unit-type i&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; script.txt: Engine ignores GAME\\ModOptions\\LuaRules &amp;amp; interprets GAME\\ModOptions\\LuaGaia just as a boolean now&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed GetScreenGeometry on win32 platforms to return the proper screenSizeY, not screenSizeY - taskbarSizeY&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; moved Spring.SetUnitRulesParam, Spring.SetTeamRulesParam, Spring.SetGameRulesParam from LuaRules-only to LuaSyncedCtrl&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed evaluator functions from LuaOpengl&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed Spring.MakeFont&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed Spring.SetRulesInfoMap, Spring.GetRulesInfoMap, Script.GetConfigString&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed Spring.CreateUnitRulesParams, Spring.CreateTeamRulesParams, Spring.CreateGameRulesParams&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed AllowUnsafeChanges(&amp;quot;USE AT YOUR OWN PERIL&amp;quot;), it&#039;s always enabled now&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Unit Scripts==&lt;br /&gt;
*&amp;lt;span&amp;gt; LUS: SetSignalMask raises error now when called outside thread&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LUS: Signal/SetSignalMask support arbitrary objects as `signal names&#039; now, bitwise logic is still applied to numbers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LUS: _G in a Lua Unit Script points to the environment of that Lua Unit Script now&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LUS: TargetWeight and BlockShot are actually called now&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; COB: Added KSIN (135, 1024*sin(x)), KCOS (136), KTAN (137) and SQRT (138) get constants.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LUS: Fixed a desync bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed middle click scroll speed on linux&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added new MiddleClickScrollSpeed option&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more responsive mouse movement&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; made it easier to select units in factories&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added new command &amp;quot;/buildwarnings [0|1]&amp;quot;, analogous to &amp;quot;/movewarnings [0|1]&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improved unit type mix in front moves&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new middle click scroll icon&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AIs==&lt;br /&gt;
*&amp;lt;span&amp;gt; added various new debug-draw callouts for profiling, state visualization, etc.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make sure the Release event always reaches dieing-state AI&#039;s&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a GetUnitVel callback, returns a unit&#039;s velocity vector&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new Python AI Interface by theGeorge &amp;amp; abma&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI bug-fixes, logic- and performance enhancements&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: fix some crashes (one on death) &amp;amp; a logic error&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI, KAIK and AAI: support unit captured&amp;amp;given from&amp;amp;to them&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RAI, KAIK and AAI: config-, log- &amp;amp; cache-files now compatible with pool archived mods&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: switched to .lua config-file format, added a basic mod whitelisting mechanism&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: event-based TM updates&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix a crash on Skirmish AI death&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Java AI Interface loading on Debian&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Java compilation on some systems&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Java crash: increase initial java heap size (by cranphin)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; send an Update event before the first UnitCreated (when initializing mid-game)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; LightingCannon (sic) finally isn&#039;t supported anymore, use LightningCannon instead (default weapondef_post.lua includes backward compability)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed a bug in LuaParser, so you can now use booleans in lua CEG configfiles (before it just accepted &amp;quot;1&amp;quot;/&amp;quot;0&amp;quot; for some tags)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed occasional bug where countdown time went into negative numbers and game never started&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed impactOnly ignored features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improved error handling on network packet level&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.81.2.1=&lt;br /&gt;
==Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed incorrect projection matrix (i.e. tiny build menu)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed some Mac and MSVC compile errors&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Switched to OpenAL-soft, that should fix volume escalation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Slightly improved detection of ATI/Nvidia OpenGL driver crashes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed team-color bug for both units and flying pieces&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AIs==&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: removed obsolete map config files&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: added BA 7.12 config file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: removed dependence on TEDClass&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.81.2=&lt;br /&gt;
==Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed OpenGL 1.4 version check&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed sync with GCC 4.3 builds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash when sending startpositions of uncontrolled team&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed race condition when taking screenshot&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; In &#039;info&#039; screen, human name instead of archive name is shown&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Reduced input CPU usage&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; StartSpectating only has an effect if the player is not already spectating&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Packet resends have higher priority now than new packets&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Print message to infolog when traffic from unknown IP gets dropped&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed vsync for Linux&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed OpenGL immediate mode rendering to work around broken ATI drivers&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; Kamikaze distance is now 3D, this fixes mines&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new UnitDef tag &#039;kamikazeUseLOS&#039; (default false)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed submarine stacking&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed units using smoothMesh unable to land at repair pads near hills&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed COB interpreter incorrect compiler optimizations (fixes e.g. XTA hovercraft)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed features not taking damage from impactOnly weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed multiple-cons-build failing on structures with open yardmaps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed maxParalyzeTime when paralyzeOnMaxHealth is enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed AI initialization process for games with &amp;gt;1 human player and for Lua AIs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed NETMSG_AISHARE for message size &amp;gt;32k&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow fetching the file path of an AI interface plugin&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash on Skirmish AI death&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.MarkerAddPoint now defaults to local&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.CreateFeature heading value is converted to closest-matching facing&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua Unit Scripts==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed handling of AimShield return value&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Sleep/WaitFor not working in Killed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Slightly improved AimWeapon/AimShield/Killed error messages&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AIs==&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI 3.18.1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: Doesn&#039;t use minkowski metric for retreat distances anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AAI: Fixed some NaNs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.81.1.3=&lt;br /&gt;
==Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed automatically assigning start position if none is chosen&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed bug in DXT5 loading (caused artifacts with teamcolors)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed F1 heightmap view&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed playing of demos created in a game in which Spring crashed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made spectator drawings white instead of random team color&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Disable recording demos from demos (default, DemoFromDemo in springrc to enable)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a mechanism to register/unregister for messages that are normally not broadcasted to game server&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AIs==&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI 3.14.5:&amp;lt;br&amp;gt;* support for: partial watermaps (plays land only), group merging,&amp;lt;br&amp;gt;auto kbot/vehicle lab selection, template configs&amp;lt;br&amp;gt;* XTA &amp;amp; BA config improvements&amp;lt;br&amp;gt;* Better lab assisting&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: do not build MExes on spots used by allies&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.81.1=&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; Terrain types and water damage are now taken into account for pathing checksum&amp;lt;br&amp;gt;(Fixes desyncs on maps with map options which modify terrain types or water damage)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed builder patrol/fight behaviour for Hold Pos and Maneuver movestates&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Being-built units are now visible on radar by default&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Rendering, UI==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added speed display&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved basic player list&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; If OpenGL 1.4 is not available, an error is shown&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed being-built unit rendering&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Placing buildings close together works again&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed canceling of first build item when buildiconsfirst is toggled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; Less strict type checking in VFS.DirList (fixes FBI2Lua converter)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / System==&lt;br /&gt;
*&amp;lt;span&amp;gt; Map options fixed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Menu doesn&#039;t crash anymore if no mods/maps found&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.81.0=&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; Builders are now smart enough to to reclaim features that block their&amp;lt;br&amp;gt;buildsite, which weren&#039;t there when they started moving to it&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed issues with features with 0 metal and 0 energy&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crashes / desyncs when using area orders with a large radius&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Hold position doesn&#039;t imply &amp;quot;don&#039;t turn&amp;quot; anymore, and units with small&amp;lt;br&amp;gt;firing arcs in general behave a lot better in this case.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units on hold position now don&#039;t get confused by nearby invalid targets&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Smooth ground mesh for better aircraft behaviour (unit tag: useSmoothMesh)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Wind fixed to stay in between map boundaries&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Momentum isn&#039;t conserved anymore in unit-unit collisions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Impulses decay every frame instead of every slow update&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Kamikaze units now do a visibility and 3d distance check&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed ships were able to &#039;climb&#039; cliffs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed multiple issues with pathmap updates after terraforms&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Rendering, UI==&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed default binds of forcestart, singlestep, debug to Alt+f, Alt+o, Alt+b&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Non-reclaimable features show up as red squares now when placing a building&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Out-of-LOS features don&#039;t show up anymore when placing a building&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed icons not rendering properly when distance-to-ground method was used&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Better mipmap handling on SMF maps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed specular lighting calculation on SM3 maps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed &amp;quot;/shadows&amp;quot; command on SM3 maps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed SM3 map holes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed &amp;quot;/wiremap 0|1&amp;quot; (argument was inversed)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Lots of other drawing fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Far-textures fixed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Load-screens preserve aspect ratio&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added checks for insufficent gfx cards&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new shadow rendering option (&amp;quot;/shadows 2&amp;quot;): it disables terrain rendering&amp;lt;br&amp;gt;in the shadow pass, which gives a huge performance increase&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed BumpWaterReflection values:&amp;lt;br&amp;gt;0 = disable; 1 = enable (no terrain); 2 = enable (with terrain - was &#039;1&#039; before)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed occasional hang when word wrapping text&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; S3O transparency is now supported even with AdvUnitShading disabled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added AllowFeatureBuildStep call-in to included gadget handler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed typos in certain featuredefs.lua, weapondefs.lua that mutilated error messages&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.Rehost fixed on Win32 when spaces in install path&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added support for modifying CTAAirMoveType (gunships)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Add GetUnitMoveTypeData(unitID) call-in, returns a table&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Spring.SetFeatureDirection&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / System==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed incorrect startpositions in skirmish games&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Proper handling of mod dependencies&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MAN pages support (Linux)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Support for external debug symbols (Linux)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed an issue with using the root of a drive as data directory&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Use less memory when reading from 7z archives&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved handling of spectators in case of sim slowdown and desync&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AIs==&lt;br /&gt;
*&amp;lt;span&amp;gt; E323AI: CPU performance improvements &amp;amp; bug fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; KAIK: better D-Gun handling&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.5.2=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; AI: Properly fix Lua AI loading&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AI: Fix crash when Lua AI team dies&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AI: Fixed clean target of ant scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed deadlock in hang detection&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed .desktop file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash on startup on Ubuntu Karmic&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed reflections&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MT: Don&#039;t crash if draw callins access features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed fading features for ATI (atiHacks)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash when parsing certain chatmessage from autohost&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash if OSC stats sender is enabled and no network is reachable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; cmake: Fixed 7-zip detection&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; AI/cmake: Split system dependent/indepentent install parts (AI_LIBS_DIR, AI_DATA_DIR)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AI: Debugging is now enabled by default in the ant scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Time profiler cleanup, both code and UI&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Show an AI&#039;s shortName + version + nick in tooltips&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.5.1=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix a bug where empty network packets were spammed (eating bandwith and demo space)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix a possible desync in the pathfinder&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix mouse jumping in windowed mode (windows)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed crash in KAIK&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.5=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; lots of bugs in the AI interface fixed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some network-related problems and improve behaviour under worse conditions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; large performance increase for units on patrol&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some performance problems with the new heatmap pathfinder&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed a crash which could occur after an AirBase was destroyed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Gui==&lt;br /&gt;
*&amp;lt;span&amp;gt; joystick support&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some bugs resolved which could lead to crashes when using ogg samples or music&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; properly handle dds textures&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some mouse-jumping in windows&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sim==&lt;br /&gt;
*&amp;lt;span&amp;gt; lua unit scripts major rework&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some sources of desync fixed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some compiling problems related to boost 1.40&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some fixes for OS X&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.4.2=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when doing lots of mapdrawing (#1632)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when loading certain cursornormal files&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix drawing of ghosted buildings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; properly initialise SDL timer for dedicated server&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed GatherWait cursor&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t send resign-command when already spectating&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix units with vlaunch missiles (#1647)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring compiles boost 1.40&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.4.1=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix missing tree fog, misc fog fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash in AI pathing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crashes in the Java AI interface&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added VFS.MapArchive&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix possible crash on exit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when loading certain ogg-files&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.4.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t reclaim dragonteeth with area-reclaim&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; lua unit script framework respects script tag&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.3.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix direct control unit movement (forwards and backwards)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t spam empty directories everywhere&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix BA crash when doom was installed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix desync in pathfinder&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix music timing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; single units should move in straight lines again&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix shadows on features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix LocalModelPiece::GetPiecePosIter,GetPos,GetEmitDirPos&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix vertical text aligning of multiple GUI controls&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix jumping in middle click scrolling (windows)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; massive speedup in Spring.GetVisibleUnits&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added changed font vertical alignment opchars in gl.Text &amp;amp; luaFonts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix wreckages sinking in the ground&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add a modinfo featureLOS.featureVisibility tag&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix BumpWater shorewaves&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make /nocost reversible&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; add snapToGround bool param to SetFeaturePosition (default true)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add SetFeatureAlwaysVisible (analog to SetUnitAlwaysVisible)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added changed font vertical alignment opchars in gl.Text &amp;amp; luaFonts (baseline renamed to &#039;d&#039;-&amp;gt;&#039;x&#039;, and use &#039;d&#039; for descender)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; unit script: added GetPieceTranslation, GetPieceRotation, GetPiecePosDir&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; unit script: SetSpeed/SetDirection/Go changes (see commit&amp;lt;br&amp;gt;b49928454225f19f5c439c908c0a8cad775fb7ed)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; unit script: removed Create (framework handles it)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.2.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix creation of DDS textures&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unbreak transports when loadingRadius &amp;lt;= some magic number&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Zlib-compression and decompression for lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added VFS.SubDirs(dir, pattern, modes) callout to LuaParser&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added some more map water configs to Game. table&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.1.0=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t write spring-files where they don&#039;t belong&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some rendering fixes (ATI errors, bumpwater)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; IPs of players not broadcasted&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; area reclaim doesn&#039;t know of features not in los anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; slightly better paralyzeDamage handling&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed several issues with ArchiveMover - it now moves files to&amp;lt;br&amp;gt;My Documents\My Games\Spring and should be more reliable&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.80.0.0=&lt;br /&gt;
==Engine / Simulation==&lt;br /&gt;
*&amp;lt;span&amp;gt; units can now move backwards&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; notable speed improvement of feature handling (unit wrecks, tress...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaCOB: make it possible to make units with Lua instead of bos/cob&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some fixes for sm3 map-format&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; pathfinding improvements for close groups of units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reclaim / ressurection now correctly exported to LuaAI&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make better use of SSE functions for speed improvements&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; now compatible with Boost 1.34 again (was 1.35 for spring 0.79)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine / GUI, System==&lt;br /&gt;
*&amp;lt;span&amp;gt; IPv6 support for all parts of the engine&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; caching for 7z archives: speed improvements at high compression levels (solid archives now usable)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rudimentary menu when starting spring executable directly&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; BumpWater got a major speed increase, and shorewaves look better&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; various improvements for the sound system (multithreading, fixes for music, ogg-effects...)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AIs==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /aikill and /aicontrol commands (only works in singleplayer in this version)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AIs won&#039;t crash the game anymore on startup&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; some AIs play better now (especially KAIK)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; a lot of minor bugs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Dedicated Server==&lt;br /&gt;
*&amp;lt;span&amp;gt; ingame stats exported to the autohost on game end&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; always print IPs of players, even if connection fails&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow password-protecting client slots to prevent name spoofing (needs lobby support)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.79.1.1=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix microlags and increased CPU usage for dedicated server&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix the game ending when playign with AIs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; various AI-interface and AI-related fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fallback to Lua for unhandled actions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed exploit where spectator could make Team 0 resign&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix certain soundeffects&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.79.1=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when a direct-controlled unit dies&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix watching of demos&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; various AI-related fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SetUnitShieldState fixed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix an infinite memory allocation loop on startup&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; restore acceptable framerate on vey old cards&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.79=&lt;br /&gt;
==Major stuff==&lt;br /&gt;
*&amp;lt;span&amp;gt; rewritten AI interface in C&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new font renderer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; sound system and music overhaul&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;&amp;gt; 2292 files changed, 149700 insertions, 290245 deletions&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.78.2.1=&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix for game refusing to speed up after a slowdown&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; set MaxSpeed to 20 on (test)singleplayer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix insta-gameover vs. AIs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed the server to run away from the local player on high gamespeeds&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.78.2=&lt;br /&gt;
==General bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash on gamestart with lots of players&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; should fix most of the desyncs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix startscript not written in demo header&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; units trying to stay in LOS of a target account for mip levels&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix the no-commander-for-side-Arm problem for local games not based on TA content&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; cob: made modelpiece mapping case-insensitive&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; initialize relPos in EmitSfx&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix for a fix in GetEmitDirPos&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix aircraft not flying back to repair pads when all are reserved&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; planes that are being refuelled aren&#039;t able to fire anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; clamp map position in unitLoader.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; players who didn&#039;t choose a start position start in their ally box&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed short command line params on windows (mantis #1271)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t try to kill dead teams&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add gamemode 3 (no game over) and make it the default in non-AI non-script.txt games&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed luabind + lua-startscripts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed multithreaded pathing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed partial match test for piece mapping&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed emitsfx crash (Mantis: #1252,#1238 &amp;amp; #1242)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; stunned planes shouldn&#039;t keep repair pads reserved&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; always apply a miniscule amount of impulse when a unit is damaged&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed AltTab bug on gpus w/o FBO support&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; EndGameBox shouldn&#039;t render stats if the game hasn&#039;t started&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; changed minimap_startbox.lua to not show cones in top left (#1272)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; StartPosSelector now unloads itself when game is started without sending start positions.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed refraction=2, disabled endless ocean for maps that don&#039;t show any water at the start of the game&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix #1258 (FBO crash on exit with non-FBO gpus)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; gl.Texture() can now load the textures of s3o features, syntax is gl.Texture(&#039;%&#039;..(Game.maxUnits+featureDefID)..(&#039;:0&#039; or &#039;:1&#039;))&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a new (unsynced) callout Spring.SetWaterParams, it needs cheating enabled and allows you to edit the mapwater settings ingame&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Luamsg if null-characters where inside&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; add an GetUnitTransformMatrix unsynced callout (handy for shadow algs)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; add RAI to installer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow the user to close TASClient / downloader during install&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.78.1.1=&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Features (wrecks, rocks) not beeing drawn with reflective units&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.78.1=&lt;br /&gt;
(notice the new version number scheme, its MAJOR (0.78) - MINOR (1))&lt;br /&gt;
==Crashes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash on window resizing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; more groundDecal fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not force useFPShadows to true unless they are supported (to prevent crashes during map-loading)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix UDP buffer overrun&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; use %CSIDL_LOCAL_APPDATA%/springsettings.cfg (e.g. \Users\&amp;lt;user_name&amp;gt;\AppData\Local\) to store settings instead of registry&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; use SSE instead of X87 for FP-calculations&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; if in Choose ingame startposition mode its possible to play a map with more players than startpositions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix the aircraft hovering / drifting&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix random start positions not being random&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix area-attack for aircraft (#1144 again)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GenerateTargets no longer has much information that the team requesting targets doesn&#039;t have&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix spikes / lags in hosting demos&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t allow gunships to drift off the map&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make planes bobble in place gently by default, and make hoverfactor work as intended&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix unit reply sound&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t open a (unused) network socket in single player mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t let static beamlasers overshoot&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new collision volume types: sphere, footprint.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units/features with no collision volume defined get &#039;footprint&#039; type by default now, this restores the 0.76b1 behaviour as default&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Gave COB function BlockShotX a third parameter, userTarget, uses the engine&#039;s hasUserTarget value, that seems to reflect when unit has an attack order&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix teamstats in demofile&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t fail with &amp;quot;network unreachable&amp;quot; instantly, but wait until timeout or connection fix&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Spring start / script.txt changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; added Game/MyPlayerName (MyPlayerNum is now deprecated and will be removed sometimes)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; send the gamesetup to each client once they join the server&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Player / Team / Mod - options are not needed anymore for clients, they are transfered from the server once ingame&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; Argh&#039;s ground-decal shader shadow tweak&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; enable startboxes by default&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; decreased CPU load and increase drawing speed lines&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix small memleak when resizing the window&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; The protection ring shows up for non-stockpile interceptors&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix detection of units under mouse for spectators&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix the CTeam statistics tracking&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; do not force useFPShadows to true unless they are supported (to prevent crashes during map-loading)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix for annoying flickering of the grounddetail texture in CA if some LUPS fx were visible&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed a bug with waterplane on centerrock (the terrain is deeper than the water plane was drawn)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; made forcestart a real shortcut, so you can unbind it&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t draw the terrain if curMaxHeight&amp;lt;0 and voidwater&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix long commandline options for linux build&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; dynamic sky rednerspeed improvements&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; added Spring.GetLastMessagePositions() (returns the 10 last message positions)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; moved Spring.GetDrawSelectionInfo() LuaUnsyncedCtrl -&amp;gt; LuaUnsyncedRead&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; moved Spring.GetSoundStreamTime() LuaUnsyncedCtrl -&amp;gt; LuaUnsyncedRead&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a 2nd return value to Spring.GetSoundStreamTime() (total sound stream length in seconds)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made it possible to specify start positions in map with LUA .smd file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Immobile Builders doesn&#039;t put factories on patrol and doesn&#039;t give a stop order&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t crash/abort() on invalid handles, but throw exception instead&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix crash bug in unitsync when UnInit/Init was called after an earlier Init which returned error code&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Doesn&#039;t leak exceptions anymore over C interface.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Doesn&#039;t just crash by design anymore after something goes wrong.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added API GetNextError, can be used to get error queue (currently limited to 1 error)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added SetSpringConfigFile(char*): reinitialise config handler to use the provided path&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added char* GetSpringConfigFile(): return the currently used path to the config file&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Deprecated APIs:&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; GetCurrentList&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; AddClient&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; RemoveClient&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; GetClientDiff&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; InstallClientDiff&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; IsUnitDisabled&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; IsUnitDisabledByClient&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed all code supporting those functions.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; These deprecated functions pop up MessageBox once on windows to nag lobby devs.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Use engine&#039;s logOutput, still writes to unitsync.log (overwrites, doesn&#039;t append)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ProcessUnitsNoChecksum is now identical to ProcessUnits.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ProcessUnits now returns 0 immediately (but should still be called in loop until it returns 0, in case it&#039;s changed sometime later)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix groups.ini being overwritten by installer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed all maps and mods from the installer&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AAI v0.875&lt;br /&gt;
*&amp;lt;span&amp;gt; Current amount of land/water within the base is taken into account when selecting factories (e.g. don&#039;t order water factories on a land map anymore)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved AAIs behaviour on water maps with start positions on islands/land masses&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved metal extractor construction algorithm (spots closer to available builder, faster algorithm, works better if there are land and sea spots available at the same time)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Continent file version bumped to 0.87&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a crash on shut down&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.77b5=&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; check if common unitsync users are running, abort installation if any is found&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; don&#039;t download and install RiverDale and SmallDivide when the user already has it&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Crashes==&lt;br /&gt;
*&amp;lt;span&amp;gt; even more preventions of DIV0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; whe watching a demo with a setup locally, overwrite maxspeed with 10&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix mousehover detection for radar icons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed performance of Lua fontHandler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make the orbit-controller actually do something on win32&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; make the orbit-controller speeds configurable&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; rescale fonts on window resize so they don&#039;t look ugly&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed black border blending of fonts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ATI drivers lie about not supporting extensions required by shadows. we ignore that extension now&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; new fbi tag: bankingAllowed - only affects hoverAttack=1 units; controls if the aircraft can bank.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fbi tag upright now affects gunships&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix CAirMoveType using an uninitialized variable (maxSpeed)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix Aircraft fuel not working properly on units with multiple weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix SendLuaMsg&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; improve heading table resolution, this makes huge units less jerky&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix the gamespeed not going back up after it was slowed down&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; when ArchiveCache has not been written yet, do not add archive dependencies that are already in the chain (was breaking demos)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix factories switching their yardmap to fully-blocked when a unit is present inside (so units don&#039;t getstuck inside)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed map defined detailtex&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix LUA Spring.GetTeamResources does not return &amp;quot;received&amp;quot; for one player on each team&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync / Lobby interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; engine now loads many start script options from GAME\ModOptions\ section in start script, instead of just GAME\&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added EngineOptions.lua to springcontent.sdz, this contains the default engine options for backward compatibility&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; GetModOptions unitsync call parses both EngineOptions.lua and ModOptions.lua, and returns combined list of options&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Random==&lt;br /&gt;
*&amp;lt;span&amp;gt; lots of fixes to CMake and dedicated server (already released)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; minor KAIK stability fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.77b4=&lt;br /&gt;
==Crashes==&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed a crash (on exit) in colormap.cpp&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed another division /0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crashes on &amp;quot;/take&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash when loading units into transporters&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix tabulator toggling overview mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; reduce the maxBreaking-is-zero message spam&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix far textures showing up as gray rectangles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; the error message &amp;quot;no writable directories found&amp;quot; now has a windows version too&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix explosion spheres appearing at wrong position&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix attackorder for radar dots&amp;lt;/span&amp;gt;&lt;br /&gt;
==&amp;lt;br&amp;gt;Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; fix attacking gaia units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix the collision detection for dgun (and other noExplode) projectiles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made gunships (and possibly other units too) point their noses at the midPos of their target instead of the pos, the old behaviour could cause trouble with units where midPos and pos differ much.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added crashDrag tag (float, default 0.005) to fighter/bomber planes, when the plane is crashing it uses this drag instead of the automatically calculated drag it uses when flying. The calculated drag is no longer used when crashing, even if no crashDrag tag is present in the unit fbi&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix (AirMoveType) aircraft refueling&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix gameend detected not propperly&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; gameslowdown triggers at higher CPU usage and is limited to half the userspeed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==0.77b3==&lt;br /&gt;
User Interface&lt;br /&gt;
*&amp;lt;span&amp;gt; added a simple Orbit-Camera controller&amp;lt;br&amp;gt;META-key + LMB + drag ==&amp;gt; alter elevation, rotation&amp;lt;br&amp;gt;META-key + MMB + drag ==&amp;gt; pan up/down/left/right&amp;lt;br&amp;gt;META-key + RMB + drag ==&amp;gt; zoom&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix transports not killing their transportees when they should&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; update installer shortcuts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; when kicking a player, kick only the player and don&#039;t disconnect everyone&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix invalid command spam&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix some divisions through 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fix crash for all players when someone gives away all his units&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.77b1, 0.77b2=&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; all commands are prefixed with &#039;/&#039; instead of &#039;.&#039; (&amp;quot;.cheat&amp;quot; becomes &amp;quot;/cheat&amp;quot;, etc.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /mapmarks [0|1]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /allmapmarks [0|1]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /forcestart command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /ally teamID [0|1] (Ingame alliances)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /commands (shows all registered commands in the console)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; whisper private messages to any other player ingame (excluding spectators) by typing &amp;quot;/w Playername Your secret message&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new camera controller: SmoothCamera&amp;lt;br&amp;gt;behaves like overview controller, but feels much smoother&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added possibility to specify files that should be excluded from Spring&#039;s&amp;lt;br&amp;gt;archive checksumming routines (&#039;springignore.txt&#039;).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added commandline resolution change:&amp;lt;br&amp;gt;./spring -xresolution 800 -yresolution 600&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /unitreplyvolume [0.0-1.0]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /hardwarecursor [0|1]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /minimap drawprojectiles [0|1]&amp;lt;br&amp;gt;(you can turn off drawing of projectiles on the minimap now)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /grounddecals [0|1]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /movewarnings [0|1]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added /globalLOS [0|1] (needs cheats on)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the /luamoduictrl [0|1] command. Enables LuaRules/LuaGaia access&amp;lt;br&amp;gt;to many LuaUI callins/functions.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added ground rendering detail factors:&amp;lt;br&amp;gt;GroundLODScaleReflection&amp;lt;br&amp;gt;GroundLODScaleUnitReflection&amp;lt;br&amp;gt;(GroundLODScaleRefraction unused atm)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added TextureLODBias to settings (global mipmapping bias)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added CompressTextures to settings (it compress textures on runtime)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added UsePBO to settings (enables PixelBufferObject usage for smf texture loading)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added CamModeName as an alternate for CamMode&amp;lt;br&amp;gt;(should still be backwards compatible for settings programs)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added SPRING_DATADIR variable on linux&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added option &amp;quot;AtiHacks&amp;quot; to settings. This fixes an issue with severe&amp;lt;br&amp;gt;display corruption during building, on ati drivers, where multiple&amp;lt;br&amp;gt;colored lines criss-cross the screen. It also fixes issues with the&amp;lt;br&amp;gt;new texture mipmap generation.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; You can now cycle through the last 10 message positions with F3.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Spring Engine==&lt;br /&gt;
*&amp;lt;span&amp;gt; multithreaded avi-generator&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new water renderer: bumpwater (&amp;quot;/water 4&amp;quot;), pretty and fast&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; the usual speedups and performance improvements&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Font rendering system overhaul&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Functionality of Sensors.tdf and Particles.tdf moved to modrules. removed Sensors.tdf or Particles.tdf&amp;lt;br&amp;gt;Transfers resources.tdf to resources.lua, and resources_map.tdf to resources_map.lua.&amp;lt;br&amp;gt;Sidedata.tdf -&amp;gt; sidedata.lua&amp;lt;br&amp;gt;icontypes.lua&amp;lt;br&amp;gt;changed SideData &#039;commander&#039; tag to &#039;startUnit&#039;&amp;lt;br&amp;gt;Replaced &#039;messages.tdf&#039; with &#039;messages.lua&#039;&amp;lt;br&amp;gt;modinfo.tdf --&amp;gt; modinfo.lua&amp;lt;br&amp;gt;ArchiveCacheV6.txt --&amp;gt; ArchiveCacheV7.lua&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Add &#039;springcontent.sdz&#039; as the last dependency for all primary mod archives&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Custom collision volumes for Units and Features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; you can ally / unally other teams ingame using the &amp;quot;/ally [teamnumber] [0|1]&amp;quot; command (needs to be activated in lobby)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made the groundplate decals follow their parent building&#039;s facing.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow modnames (e.g. &amp;quot;OTA Content&amp;quot;) in dependX tag (modinfo).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed 50% capture progress after an unit got captured.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made units transfer their speed to their wrecks.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; submarines can now travel directly underneath surface vessels and floating obstacles&amp;lt;br&amp;gt;(and conversely; ships can move across underwater objects), EDIT your mod&#039;s MoveInfo&amp;lt;br&amp;gt;entries so that the classes used by submarine-style units have &amp;quot;subMarine=1;&amp;quot; set if&amp;lt;br&amp;gt;you want to enable this fully&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Increased weapon limit per unit to 32.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following new tags to modrules.{lua,tdf}&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; repair.energyCostFactor&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; capture.energyCostFactor&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; resurrect.energyCostFactor&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; reclaim.unitEnergyCostFactor&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; reclaim.featureEnergyCostFactor&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; reclaim.unitMethod&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; reclaim.unitEfficiency&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; reclaim.allowEnemies&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; reclaim.allowAllies&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow any key binding to a CMDTYPE_ICON command to use the &#039;queued&#039; keyword&amp;lt;br&amp;gt;(except for build and stockpile commands, which already have special handling)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Keep units in various situations from deciding to attack units they&amp;lt;br&amp;gt;shouldn&#039;t (noChaseCatagory, neutral, under water without water weapons).&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Units &amp;amp; Weapons==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added canFireControl unitdef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the stop-turn-move-stop-turn behavior for ground units (new udef tag, turnInPlace)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added maxRepairSpeed tag for builders. Limits the rate a con swarm of any&amp;lt;br&amp;gt;size can repair a single target.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made accuracy, sprayangle and similar tags work for starburst missiles.&amp;lt;br&amp;gt;The inaccuracy is applied when the missile turns toward its target.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added capturable tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Implemented &#039;y&#039; value for yardmaps which means this square is not blocked.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Have fighting, patrolling and guarding aircraft and guarding ground units&amp;lt;br&amp;gt;follow noChaseCatagory.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added per-weapon highTrajectory tag (int, default 2). It acts like the unit&amp;lt;br&amp;gt;tag, 0 is always low trajectory, 1 always high and 2 uses the unit&#039;s setting&amp;lt;br&amp;gt;(whether the unit uses a switch or fixed setting).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added impactOnly weapon tag (bool, default false), if set the weapon does damage&amp;lt;br&amp;gt;by colliding with units instead of causing an explosion (the CEG will still run)&amp;lt;br&amp;gt;to avoid the shortcomings of small AOEs. It&#039;s only implemented for projectile weapons&amp;lt;br&amp;gt;so far.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Custom collision volumes:&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; collisionVolumeType (either: &amp;quot;ellipsoid&amp;quot;,&amp;quot;cylT&amp;quot; where &#039;T&#039; is one of {X, Y, Z}, &amp;quot;box&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; collisionVolumeScales (float3)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; collisionVolumeOffsets (float3)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; collisionVolumeTest (0: per-frame hit detection, 1: raytraced)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; all these tags are the same for Features&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added shieldRechargeDelay weapon tag (float, default 0). The delay is the number&amp;lt;br&amp;gt;of seconds the shield won&#039;t charge after being hit (kinda like the idle autoheal&amp;lt;br&amp;gt;for hitpoints)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;sonarStealth&#039; unitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new stockpileTime weapondef tag. It allows seperate reload and stockpile&amp;lt;br&amp;gt;times for stockpile weapons.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow for square metal extraction areas (use the new extractSquare unitdef tag).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added moveState and fixed fireState unitdef tags.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added strafeToAttack tag. Moving sideways when in range but not shooting optional&amp;lt;br&amp;gt;behaviour, the behaviour fails if the unit just takes its time for aiming (or&amp;lt;br&amp;gt;cannot shoot at all) or has any other reason not to shoot.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added avoidNeutral (targetting) and collideNeutral (projectiles) weapon tags.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added verticalSpeed (float, default: 3.0) unitDef tag  for non-fighter/bomber&amp;lt;br&amp;gt;planes to define the speed of takeoff and landing (or loading).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made missiles obey burnblow=1 (existing tag), the missile will explode in midair&amp;lt;br&amp;gt;instead of turning away or falling down when its flighttime expires if the tag is set.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &#039;customParams&#039; table to both featureDefs and weaponDefs&amp;lt;br&amp;gt;(accessible via the lua FeatureDefs and WeaponDefs&#039; tables).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; only add &amp;quot;.wav&amp;quot; extension for unitdef sounds if it is missing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made MeleeWeapon obey impulseFactor.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Maps==&lt;br /&gt;
*&amp;lt;span&amp;gt; Maps have their own resource_map.lua/resource_map.tdf now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; converted map config scripts to lua format (LuaParser / MapParser)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; MapOptions.lua is now handed the &#039;Map&#039; table information as well&amp;lt;br&amp;gt;(allows one to write a generic MapOptions.lua file that accesses&amp;lt;br&amp;gt;the SMD/SM3 files to retrieve the defaults)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; the SM3 format is yet to be converted to the lua format&amp;lt;br&amp;gt;(but its MapInfo information is)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added SMF height overrides in the SMD file, example:&amp;lt;br&amp;gt;smf = {&amp;lt;br&amp;gt;minheight = -100.0f,&amp;lt;br&amp;gt;maxheight =  200.0f,&amp;lt;br&amp;gt;}&amp;lt;br&amp;gt;(note:  these values can be changed by MapOptions)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new water tags (mostly used by the BumpWater renderer):&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; shoreWaves           (true)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; forceRendering       (false)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; ambientFactor        (1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; diffuseFactor        (1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; specularFactor       (1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; specularPower        (20.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; diffuseColor         float3(1.0, 1.0, 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; specularColor        float3(light.groundSunColor)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; fresnelMin           (0.2)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; fresnelMax           (0.8)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; fresnelPower         (4.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; reflectionDistortion (1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; blurBase             (2.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; blurExponent         (1.5)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; perlinStartFreq      (8.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; perlinLacunarity     (3.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; perlinAmplitude      (0.9)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; foamTexture&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; normalTexture&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; numTiles&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; caustics (texture table)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==COB==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new COB get constants MIN (131), MAX(132) and ABS(133).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the SONAR_STEALTH (108) COB get/set parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LUA changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;teamcolors.lua&#039; to the installers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed &#039;gui.lua&#039; to &#039;luaui.lua&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed LuaCob, and redirected Cob2Lua calls to LuaRules&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed the following compatibility defines from luaconf.h&amp;lt;br&amp;gt;(can break compability with old lua scripts):&amp;lt;br&amp;gt;LUA_COMPAT_GETN&amp;lt;br&amp;gt;LUA_COMPAT_VARARG&amp;lt;br&amp;gt;LUA_COMPAT_MOD&amp;lt;br&amp;gt;LUA_COMPAT_LSTR&amp;lt;br&amp;gt;LUA_COMPAT_GFIND&amp;lt;br&amp;gt;LUA_COMPAT_OPENLIB&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Moved most of the LuaUI call-outs into LuaUnsyncedRead&amp;lt;br&amp;gt;and LuaUnsyncedCtrl. The LuaUnsyncedCtrl call-outs require&amp;lt;br&amp;gt;that the modUICtrl variable be enabled for gadget scripts&amp;lt;br&amp;gt;to use them.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Moved most of the LuaUI call-ins into LuaCallInHandler and&amp;lt;br&amp;gt;LuaHandle. The moved call-ins require that the modUICtrl&amp;lt;br&amp;gt;variable be enabled for gadget scripts to receive them.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Updated included gadgetHandler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed unwanted/confusing widgets.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fonts.lua can load fonts from the VFS&amp;lt;br&amp;gt;(and will create LuaUI/Fonts/ if it does not exist)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed the unused CommandDesc &#039;hotkey&#039; member&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed CommandDescription&#039;s  &#039;onlyKey&#039;  to  &#039;hidden&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; lua scripts now get first crack at all mouse events&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Treat SDD file sizes as dynamic, so that lua scripts can&amp;lt;br&amp;gt;be reloaded while dev&#039;ing without having file size mismatches&amp;lt;br&amp;gt;(LuaRules, LuaGaia, mod widgets, etc...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added some new constants to the lua Game{} table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the dynamic HeightMapTexture&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; FLOAT32/LUMINANCE format, NEAREST/NEAREST filtering&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; can be accessed by lua scripts using &#039;$heightmap&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; can be disable by clients with &#039;HeightMapTex=0&#039; (config parameter)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added multiple new callins:&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; UnitEnteredWater(unitID, unitDefID, unitTeam)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; UnitEnteredAir(unitID, unitDefID, unitTeam)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; UnitLeftWater(unitID, unitDefID, unitTeam)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; UnitLeftAir(unitID, unitDefID, unitTeam)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; PlayerChanged(playerID)  (player changed team or spectating state)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; TeamChanged(teamID)      (team changed allyteam, not useful yet)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; UnitCommand(unitID, unitDefID, unitTeam, cmdID, cmdOpts, cmdParams) (note that cmdOpts is a number)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; UnitMoveFailed()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; MoveCtrlNotify(unitID, unitDefID, unitTeam, data)&amp;lt;/span&amp;gt;&lt;br /&gt;
::::*&amp;lt;span&amp;gt; currently called with data = 1 if the unit hits the ground and stops&amp;lt;/span&amp;gt;&lt;br /&gt;
::::*&amp;lt;span&amp;gt; return true to disable the unit&#039;s MoveCtrl&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; ProjectileCreated(projectileID, projectileOwnerID) (arg #2 is -1 if no owner)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; ProjectileDestroyed(projectileID)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; GamePreload() (Called at the end of the loading process)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; GameStart()   (Called when the game is about to start)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; TerraformComplete(UnitID, UnitDefID, UnitTeam, BuildUnitID, BuildUnitDefID, BuildUnitTeam)&amp;lt;br&amp;gt;(it gets called after the terraforming for a construction is complete (once&amp;lt;br&amp;gt;per terraforming builder), the return value is whether the con should stop&amp;lt;br&amp;gt;building.)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; DrawGenesis()&amp;lt;/span&amp;gt;&lt;br /&gt;
::::*&amp;lt;span&amp;gt; called immediately following Update()&amp;lt;/span&amp;gt;&lt;br /&gt;
::::*&amp;lt;span&amp;gt; called even when the game window is minimized&amp;lt;/span&amp;gt;&lt;br /&gt;
::::*&amp;lt;span&amp;gt; modelview and projection matrices are identities&amp;lt;/span&amp;gt;&lt;br /&gt;
::::*&amp;lt;span&amp;gt; can be used to update GPU-side physics simulation&amp;lt;br&amp;gt;textures and custom per-unit textures&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; a real ViewResize() call-in&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the unicode values to the lua KeyPress() and KeyRelease() call-ins&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Replaced Spring.GetMouseMiniMapState() with:&amp;lt;br&amp;gt;Spring.GetMiniMapGeometry() -&amp;gt;&amp;lt;br&amp;gt;posX, posY, sizeX, sizeY, minimized, maximized, &amp;lt;false | &amp;quot;left&amp;quot; | &amp;quot;right&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed the GetUnitNearestEnemy() lua call-out to:&amp;lt;br&amp;gt;GetUnitNearestEnemy(number unitID[, number range[, boolean useLos=true]])&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added geometry shader support to LuaOpenGL&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.ValidUnitID(number id)    -&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.ValidFeatureID(number id) -&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitIsDead()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetModUICtrl()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetViewGeometry()   -&amp;gt; sizeX, sizeY, posX, posY&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetWindowGeometry() -&amp;gt; sizeX, sizeY, posX, posY&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetScreenGeometry() -&amp;gt; sizeX, sizeY, posX, posY&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.IsAboveMiniMap(x, y) -&amp;gt; boolean&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitLastAttacker()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitFuel()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetUnitFuel()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitSensorRadius(unitID, &amp;lt;type&amp;gt;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetUnitSensorRadius(unitID, &amp;lt;type&amp;gt;, radius)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new projectile call-outs:&amp;lt;br&amp;gt;Spring.GetProjectilePosition(projectileID) -&amp;gt; px, py, pz&amp;lt;br&amp;gt;Spring.GetProjectileVelocity(projectileID) -&amp;gt; vx, vy, vz&amp;lt;br&amp;gt;Spring.SetProjectilePosition(projectileID, px, py, pz) -&amp;gt; nil&amp;lt;br&amp;gt;Spring.SetProjectileVelocity(projectileID, vx, vy, vz) -&amp;gt; nil&amp;lt;br&amp;gt;Spring.SetProjectileDetonate(projectileID) -&amp;gt; nil&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added the GL evaluator functions to the lua GL interface&amp;lt;br&amp;gt;(note the gl.EvalEnable() and gl.EvalDisable() can only be&amp;lt;br&amp;gt;called in a gl.Eval(func) block).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetUnitCollisionVolumeData(id, xs, ys, zs, xo, yo, zo, vtype, ptype, paxis)&amp;lt;br&amp;gt;and Spring.SetFeatureCollisionVolumeData() (same args)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetLastMessagePosition(x,y,z)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetUnitLosMask(unitID, allyTeamID, number | table) -&amp;gt; nil&amp;lt;br&amp;gt;and Spring.SetUnitLosState(unitID, allyTeamID, number | table) -&amp;gt; nil&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.FixedAllies()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Reverted the GetPositionLosState() to its original configuration (no air los)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.IsPosInLos()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.IsPosInRadar()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.IsPosInAirLos()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.PauseSoundStream(), Spring.GetSoundStreamTime(),&amp;lt;br&amp;gt;Spring.SetSoundStreamVolume(number)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added burst, burstRate and projectiles to Spring.SetUnitWeaponState&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.AddUnitIcon(string name, string texture&amp;lt;br&amp;gt;[, number size[, number distance[, bool radiusAdjust]]])&amp;lt;br&amp;gt;Spring.FreeUnitIcon(string name)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetUnitSonarStealth()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SpawnCEG(tag, px, py, pz, dx, dy, dz, rad, dmg) synced callout&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetHeightMapFunc(lua_func,arg1,arg2,..),&amp;lt;br&amp;gt;Spring.AddHeightMap(x, y, h) -&amp;gt; `final height`&amp;lt;br&amp;gt;Spring.SetHeightMap(x, y, h [,t]) -&amp;gt; `absolute value changed`&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.ExtractModArchiveFile(path) callout&amp;lt;br&amp;gt;For example, Spring.ExtractModArchiveFile(&amp;quot;sounds/boom.wav&amp;quot;)&amp;lt;br&amp;gt;will create a directory &amp;quot;sounds/&amp;quot; and extract &amp;quot;boom.wav&amp;quot; to it.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitPiecePosDir(unitID, piece) -&amp;gt; posx,posy,posz, dirx,diry,dirz&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitVectors(unitID) -&amp;gt; {front_x,front_y,front_z},{up_x,up_y,up_z},{right_x,right_y,right_z}&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitWeaponVectors(unitID,weaponNum) -&amp;gt; wpos_x,wpos_y,wpos_z, wdir_x,wdir_y,wdir_z&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.ActiveShader(shaderID, function(), ...) (safe way to set shader uniforms in non-drawing code)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.DepthClamp(bool)  (not always available)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.UnsafeState(number, [bool reverse, ] function, ...)&amp;lt;br&amp;gt;(glEnable() / glDisable() for unknown states; considered &#039;unsafe&#039;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Occlusion Queries:&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.CreateQuery() -&amp;gt; query&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.DeleteQuery(query)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.RunQuery(query, function, ...)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.GetQuery(query) -&amp;gt; number&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following unsynced query call-outs:&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Spring.GetUnitLuaDraw()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Spring.GetUnitNoDraw()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Spring.GetUnitNoMinimap()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Spring.GetUnitNoSelect()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the fbo &#039;readbuffer&#039; parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.ReadPixels(x, y, w, h [,format])&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added StencilTests:&amp;lt;br&amp;gt;NOTES: The engine expects that the stencil buffer be left in a&amp;lt;br&amp;gt;state of all 0&#039;s when a task has finished with it. This&amp;lt;br&amp;gt;is not enforced by the lua backend.&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.StencilTest(bool)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.StencilMask(bits)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.StencilFunc(func, ref, mask)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.StencilOp(fail, zfail, zpass)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.StencilMaskSeparate()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.StencilFuncSeparate()&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; Added gl.StencilOpSeparate()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.BlendEquation()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.BlendEquationSeparate()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.BlendFunc()  -- redundant&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.BlendFuncSeparate()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.Blending() convenience names:&amp;lt;br&amp;gt;name           blend_src    blend_dst             enabled&amp;lt;br&amp;gt;&amp;quot;add&amp;quot;          ONE          ONE                   true&amp;lt;br&amp;gt;&amp;quot;add_alpha&amp;quot;    SRC_ALPHA    ONE                   true&amp;lt;br&amp;gt;&amp;quot;alpha&amp;quot;        SRC_ALPHA    ONE_MINUS_SRC_ALPHA   true&amp;lt;br&amp;gt;&amp;quot;reset&amp;quot;        SRC_ALPHA    ONE_MINUS_SRC_ALPHA   true&amp;lt;br&amp;gt;&amp;quot;disable&amp;quot;      SRC_ALPHA    ONE_MINUS_SRC_ALPHA   false&amp;lt;br&amp;gt;&amp;quot;color&amp;quot;        SRC_COLOR    ONE_MINUS_SRC_COLOR   true&amp;lt;br&amp;gt;&amp;quot;modulate&amp;quot;     DST_COLOR    ZERO                  true&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Picking support:&amp;lt;br&amp;gt;gl.RenderMode()&amp;lt;br&amp;gt;gl.SelectBuffer()&amp;lt;br&amp;gt;gl.SelectBufferData()&amp;lt;br&amp;gt;gl.InitNames()&amp;lt;br&amp;gt;gl.PushName()&amp;lt;br&amp;gt;gl.PopName()&amp;lt;br&amp;gt;gl.LoadName()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gl.Texture($shading) &amp;amp; gl.Texture($grass)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allowed to use gl.CopyToTexture with non GL_TEXTURE2D, i.e. GL_TEXTURE_RECTANGLE&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Modified Spring.GetVisibleUnits() so that the team specifier can&amp;lt;br&amp;gt;use the ALL_UNITS, ALLY_UNITS, ENEMY_UNITS, and MY_UNITS values.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &#039;facing&#039; parameters can now use long strings: &#039;north&#039;, &#039;south&#039;, &#039;east&#039;, &#039;west&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.UnitCreated() call-out now accepts unitDef names and unitDef IDs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.SendCommands() can use a bunch of string arguments as well as the old&amp;lt;br&amp;gt;table format. e.g Spring.SendCommands(&#039;echo aoeu&#039;, &#039;info 2&#039;, &#039;specteam 0&#039;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Spring.UnitRendering interface to make it possible to emulate the default 3do/s3o shaders&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; fixed $shadows texture params (you can now use shadow2DProj() in glsl)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; fixed wrong (!=0) check if uniform locations are set (they begin with 0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; added new uniforms: cameraposloc,shadowloc,shadowparamsloc&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; added new culling tag, so you can enable s3o backface culling w/o using a displaylist&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt; auto enable alphatest (+blending in case of cloaked stuff) for luaUnitMaterials&amp;lt;br&amp;gt;(alphatest: 0.5 for opaque and 0.1 for cloaked stuff)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed missing return;&#039;s in gl.LoadMatrix() and gl.MulMatrix()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed WarpMouse() for dual mode (minimap on the left).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the &#039;frame&#039; table value returned by Spring.GetTeamStatsHistory()&amp;lt;br&amp;gt;(and added the &#039;time&#039; value, which is in seconds).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed full-view spectators get all LuaUI  RecvLuaMsg()  messages now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Spring.SetFeaturePosition().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Spring.SetFeatureDirection().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; If Spring.SetDrawSky(false) is set, do not draw the sun.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed s3o recognition in LuaUnitDefs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new ai value AIVAL_SCRIPT returning start script text.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed ABIC AI stuff that no-one is using.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added AIHCGetUnitDefById, AIHCGetWeaponDefById, AIHCGetFeatureDefById&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaParser API to unitsync.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added OpenArchiveType(name, type) to unitsync&amp;lt;br&amp;gt;(type can be &amp;quot;zip&amp;quot;, &amp;quot;7z&amp;quot;, &amp;quot;dir&amp;quot;, or &amp;quot;hpi&amp;quot;).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;const char* GetSideStartUnit(int side)&#039; to unitsync.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added InitDirListVFS(path, pattern, modes) and&amp;lt;br&amp;gt;InitSubDirsVFS(path, pattern, modes)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Mod/Map Options : &#039;section&#039; option type added&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Mod/Map Options : &#039;style&#039; option added, syntax not defined yet&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Aircraft units that can&#039;t land not stopping when reaching the final waypoint.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed display of times in the EndGameBox (For example 9:07 displayed as 9: 7)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the grey flashing that sometimes happened when making new buildings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Prevent decay when the builder or factory is waiting (executing a wait command).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed positions occupied by units with a maxspeed of zero (hubs, etc) being considered&amp;lt;br&amp;gt;valid build-sites.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed division by zero if two units are in the exact same spot and collide.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed negative pings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix a dangling pointer when using ground decals. Could have caused desyncs&amp;lt;br&amp;gt;and LuaUI bugs.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed possible out of bounds map reads that could cause crashes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed /cheat and /skip not working in demo-playback mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed /noSpectatorChat&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed /fpshud polarity&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Randomize unitIDs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed dds mipmapping filter (was GL_NEAREST_MIPMAP_LINEAR).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed dynamic water with geforce 8x00&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed it so that units using ScriptMoveType can not be pushed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed an infinite recursion in the LuaUI layout handler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the Lua SendToUnsynced() stack check bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed ScriptMoveType vs. unit pushing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed &amp;quot;cloaked units were invisble underwater&amp;quot; with DynWater&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Blocked team changes for dead units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed beamlaser damage vs shields&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed smoke textures loading from resource.tdf (resources/graphics/smoke/smoke00 .. smoke11).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed clipping issue with units begin built.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t show two statistic windows after demo watching.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Always create/update the perlin texture used by shields and not only if shadows are enabled.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed ctrl+c, it searches now for the iscommander tag instead for the commander category.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a wrong rotation in ApplyTransform() (which is used by lua&#039;s gl.UnitPieceMultMatrix).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed black lines on CEGs when AntiAliasing is enabled.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.76b1=&lt;br /&gt;
&lt;br /&gt;
==Installer==&lt;br /&gt;
*&amp;lt;span&amp;gt; Add new installer SideBanner, Spring icon and ArchiveMover icon all&amp;lt;br&amp;gt;contributed by AF.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Put springcontent.sdz and bitmaps.sdz in upgrading installer.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Installer greatly improved - all content is downloaded from the internet based&amp;lt;br&amp;gt;on which mods and maps you choose to install.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; No more updating installer because updating and full one would be nearly&amp;lt;br&amp;gt;identical (in size and functionality).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following original content mods to the installer (downloads):&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt;Gundam&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt;Kernel Panic&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt;Evolution&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt;Spring: 1944&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt;Simbase&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added springsettings.exe by koshi.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added ArchiveMover by zizu. Automatically moves .sdz and .sd7 files to the&amp;lt;br&amp;gt;correct place (Spring folder\maps\ or Spring folder\mods\)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Moved to Satirik&#039;s lobby, huge amount of changes.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Moved shaders into springcontent.sdz&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Replacement Bark, bleaf and foam images.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Spring engine varying changes==&lt;br /&gt;
*&amp;lt;span&amp;gt; A lot of networking code was refactored.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Reintroduced heightMod to TryTarget.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New aircraft command CMD_IDLEMODE, it switches between landing when idle&amp;lt;br&amp;gt;and not landing.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Cache input and output of GetWantedDir to save a lot of expensive calculations&amp;lt;br&amp;gt;for a little loss of accuracy.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Tiny speedups in LosAdd and SafeLosAdd.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Optimized unnecessary sqrt in GuiTraceRay.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made the replay format better:&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; It has a proper header now with version field instead of the entire file&amp;lt;br&amp;gt;being just a data blob.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; The header has made the gameSetup script.txt modifications redundant: the&amp;lt;br&amp;gt;UnixTime and Spring Version are in the header, and the gameSetup script is&amp;lt;br&amp;gt;stored unmodified now.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; It stores a game ID, this can be used to match replays of the same game together.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; It stores the winning ally team, if any.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; It stores player stats.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; It stores team stats.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; It stores game duration, both in game time and wallclock time.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Small messages are once again send together in one packet.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Stop animations when network lags (timeout set to 0.5 sec).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added some OGGVorbis sound support.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added behavior to mobile units so that they will start chasing when the target&amp;lt;br&amp;gt;is running away, but before the target exits weapons range, allowing the unit&amp;lt;br&amp;gt;to fire continuously at the retreating unit, instead of the cycles of firing,&amp;lt;br&amp;gt;then running to catch up that existed prevously.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added client side network traffic tallying (per packet type).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Lasers no longer use their full texture on shots that hit before their full length.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Negative damage now allowed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Log the version of some of the major libraries (SDL, GL, GLEW, AL)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Bump the unit-limit to 10000.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lobby interface (unitsync, game setup)==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new start positions mode Choose Before Game. Useful for AIs, you can&amp;lt;br&amp;gt;select the starting position of players from the client.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Gap removal in GameSetup, players/teams/allyteams can now be given\&amp;lt;br&amp;gt;with gaps in the numbering, e.g. PLAYER10 and PLAYER14 in an 1 vs 1.&amp;lt;br&amp;gt;Ordering does still matter.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unitsync Java bindings now have a version number.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Checksum is now read from 7z/zip archive header instead of checksumming entire&amp;lt;br&amp;gt;file, making things like map list reloading faster by a huge amount.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetPrimaryModVersion() to unitsync.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Bumped to ArchiveCache version to 6 ... ArchiveCacheV6.txt&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Applied patch by tc making Spring&#039;s configuration variables available through&amp;lt;br&amp;gt;unitsync.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Disabled recursive directory scanning for .sdd and omitted files within&amp;lt;br&amp;gt;.../hidden/*  directories from the scan.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following unitsync calls:&amp;lt;br&amp;gt;int GetModValidMapCount()&amp;lt;br&amp;gt;const char* GetModValidMapCount(int index)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; Valid maps are listed in the mod&#039;s &amp;quot;ValidMaps.lua&amp;quot; file.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; A valid map count of 0 means that any map can be used with the mod.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; This can be used in concert with LuaRules to setup multi-player scenarios&amp;lt;br&amp;gt;and tutorials.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; Exposed unit-&amp;gt;maxSpeed to the AI interface.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added CallLuaRules() to CAICallback.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;AIDLL=LuaAI:&#039; -&amp;gt; CTeam::luaAI handling for LuaAI.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added AI unloading after team is destroyed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow GlobalAIs to send a startposition.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the CTRL modifier to area reclaims to allow reclaiming your own wrecks&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed some hard-coded key bindings and replaced them with:&amp;lt;br&amp;gt;edit_return&amp;lt;br&amp;gt;edit_escape&amp;lt;br&amp;gt;edit_complete&amp;lt;br&amp;gt;edit_backspace&amp;lt;br&amp;gt;edit_delete&amp;lt;br&amp;gt;edit_home&amp;lt;br&amp;gt;edit_end&amp;lt;br&amp;gt;edit_prev_line&amp;lt;br&amp;gt;edit_next_line&amp;lt;br&amp;gt;edit_prev_char&amp;lt;br&amp;gt;edit_next_char&amp;lt;br&amp;gt;edit_prev_word&amp;lt;br&amp;gt;edit_next_word&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added some reasonable default keybindings for all/ally/spec chat messaging:&amp;lt;br&amp;gt;enter -&amp;gt; send to &amp;lt;last send type&amp;gt;&amp;lt;br&amp;gt;Ctrl+enter -&amp;gt; send to All&amp;lt;br&amp;gt;Alt+enter -&amp;gt; send to Allies&amp;lt;br&amp;gt;Shift+enter -&amp;gt; send to Spectators&amp;lt;br&amp;gt;(Note that the modifier versions can be used to change the send mode ever&amp;lt;br&amp;gt;while typing the message.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the CTRL modifier to area reclaims for reclaiming all features.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; /specfullview 3 is the new default for spectating and watching demos.&amp;lt;br&amp;gt;(can view and select all units)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the ctrlpanel.txt &amp;quot;frontByEnds&amp;quot; option. (let&#039;s you use the endpoints to&amp;lt;br&amp;gt;define a front instead of the midpoint and one of the ends.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; When a factory is set on repeat, alt+build-click inserts the order as a&amp;lt;br&amp;gt;no-repeat and right after the currently built unit. Behavior is unchanged&amp;lt;br&amp;gt;if repeat is off.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added water lines while placing unit builds.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Moved the clock and fps indicators to the upper right hand corner.&amp;lt;br&amp;gt;(the default setup results in overlaps with the player info text.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Modified the LOS view to better show the los-only and radar-only conditions&amp;lt;br&amp;gt;dark  = no los, no radar&amp;lt;br&amp;gt;white = los + radar&amp;lt;br&amp;gt;blue  = los-only&amp;lt;br&amp;gt;green = radar-only&amp;lt;br&amp;gt;red   = jammed area&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Disabled shadow generation when using LOS viewmode. (would be better to add&amp;lt;br&amp;gt;shadows in LOS mode, but might as well avoid the shadow generation overhead&amp;lt;br&amp;gt;until the shadows are added.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Make Fight be able to be given a line command, like move already can be.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Only add the SelectAI button if the current selection has valid GroupAIs.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Change default keybinding for createvideo to Ctrl+Shift+F10 (was Any+F10),&amp;lt;br&amp;gt;so it is less easy to accidentally hit it.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Change savegame default keybinding from Any+F8 to Ctrl+Shift+F8,&amp;lt;br&amp;gt;for the same reason as the createvideo keybind change.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved view centering for the Free Camera mode.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made nano-particles unsynced. (and respect maxParticles)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;/cross [size]&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added .godmode [0|1] -- allows all players (even specs) to control all units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a team parameter to .give: .give [amount] &amp;lt;unitName&amp;gt; [team] @x,y,z&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; .kick and .kickbynum messages are filtered.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed &#039;/grabinput&#039; to &#039;/grabinput [0|1]&#039;, and added state reporting.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;/grounddecals [0|1]&amp;quot; command.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modinfo / modrules tags==&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow for the modder to define whether the crashing planes (and/or units&amp;lt;br&amp;gt;running long Killed() scripts) can be fired on via modrules.tdf new section:&amp;lt;br&amp;gt;[FIREATDEAD]&amp;lt;br&amp;gt;{&amp;lt;br&amp;gt;fireAtKilled=0;&amp;lt;br&amp;gt;fireAtCrashing=0;&amp;lt;br&amp;gt;}&amp;lt;br&amp;gt;The defaults are to disallow both (Spring 0.75 behaviour, both variables set&amp;lt;br&amp;gt;to 0). Spring 0.74 behaviour (allow both) can be emulated by setting both&amp;lt;br&amp;gt;variables to 1.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added modinfo.tdf &#039;version&#039;, &#039;mutator&#039;, and &#039;shortName&#039; tags.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following to modrules.tdf (default values shown):&amp;lt;br&amp;gt;[DISTANCE] {&amp;lt;br&amp;gt;builderUse2D=0;&amp;lt;br&amp;gt;}&amp;lt;br&amp;gt;[EXPERIENCE] {&amp;lt;br&amp;gt;powerScale=1.0;&amp;lt;br&amp;gt;healthScale=0.7;&amp;lt;br&amp;gt;reloadScale=0.4;&amp;lt;br&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Adds [experience] { experienceMult = 1.0; } to modrules.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Adds [flankingBonus] { defaultMode = 1; } to modrules.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Replaces the old bonus shield system with flanking bonus&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit / feature definition tags==&lt;br /&gt;
*&amp;lt;span&amp;gt; The TDF tags MetalStorage and EnergyStorage now override the StartMetal and&amp;lt;br&amp;gt;StartEnergy specified in the startscript, instead of the other way round. If&amp;lt;br&amp;gt;MetalStorage or EnergyStorage isn&#039;t specified the default values for commander&amp;lt;br&amp;gt;units are StartMetal and StartEnergy. For other units the default remains 0.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Moved the buildOptions definitions into the unitDef definitions, LuaParser&amp;lt;br&amp;gt;handles backwards compatibility.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed init_cloaked to initcloaked.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Add a tag &#039;pushResistant&#039; to UnitDef. If set to true, a unit will not be&amp;lt;br&amp;gt;pushed out of the way by another when their footprints overlap, nor will&amp;lt;br&amp;gt;it respond to BuggerOff directives when the other party has an important&amp;lt;br&amp;gt;move order. Defaults to false.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a per-soundfile volume control format for unitdefs&amp;lt;br&amp;gt;sounds = {&amp;lt;br&amp;gt;ok = &#039;oksound&#039;,&amp;lt;br&amp;gt;cancel = {&amp;lt;br&amp;gt;&#039;cancel1&#039;,&amp;lt;br&amp;gt;&#039;cancel2&#039;,&amp;lt;br&amp;gt;},&amp;lt;br&amp;gt;select = {&amp;lt;br&amp;gt;{ file = &#039;selsound1&#039;, volume = 2.0 },&amp;lt;br&amp;gt;{ file = &#039;selsound2&#039;, volume = 2.5 },&amp;lt;br&amp;gt;etc...&amp;lt;br&amp;gt;},&amp;lt;br&amp;gt;}&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Features have new tag &amp;quot;reclaimTime&amp;quot; defining how long they take to reclaim,&amp;lt;br&amp;gt;default is metal+energy.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added tags:&amp;lt;br&amp;gt;transportUnloadMethod = &amp;lt;integer&amp;gt;;  // 0 - land unload, 1 - flyover drop, 2 - land flood&amp;lt;br&amp;gt;fallSpeed = &amp;lt;float&amp;gt;&amp;lt;br&amp;gt;unitFallSpeed = &amp;lt;float&amp;gt;&amp;lt;br&amp;gt;These dictate the speed of units being dropped from the transport.&amp;lt;br&amp;gt;fallSpeed is used on the transports FBI file, to dictate the speed of all&amp;lt;br&amp;gt;units it drops, unitFallSpeed is used on each transported unit to override&amp;lt;br&amp;gt;fallSpeed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added flighttime functionality to cannons.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added flighttime to bombdroppers.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added FBI tag cantBeTransported=0|1, if set to 1 no transport can load this unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added FBI tag minTransportSize=int, determines the smallest size footprint&amp;lt;br&amp;gt;that the transport can load&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added FBI tag minTransportMass=float, determines the smallest mass unit that&amp;lt;br&amp;gt;the transport can load.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed the check for Air movetype for holdSteady FBI tag, so now ground&amp;lt;br&amp;gt;transports can use it too.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New FBI tag for transports; float unloadSpread: Controls the spacing between&amp;lt;br&amp;gt;units in an area unload command, works as a multiple, default is 1.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &#039;decloakSpherical&#039; unitDef tag  (defaults to true).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added optional 3D ranging for all builder operations.&amp;lt;br&amp;gt;(build, repair, reclaim, etc...) (per-unitdef buildRange3D=true)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New unitDef parameters:&amp;lt;br&amp;gt;int    flankingBonusMode&amp;lt;br&amp;gt;float  flankingBonusMax&amp;lt;br&amp;gt;float  flankingBonusMin&amp;lt;br&amp;gt;float  flankingBonusMobilityAdd&amp;lt;br&amp;gt;float3 flankingBonusDir&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;canSelfDestruct = true&amp;quot; unitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Enable CEGs to be tied to pieces of exploding units&amp;lt;br&amp;gt;(CEG replaces the default smoke if used, but not the miniscule fire-effect)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added CEG opcodes y, x, a, p and q. Except for p those operate on a set of 16&amp;lt;br&amp;gt;buffers that store a float value each.&amp;lt;br&amp;gt;y# - Yank: Stores the running value in the buffer # and returns 0.&amp;lt;br&amp;gt;x# - Multiply: Multiplies the value with the contents of buffer #.&amp;lt;br&amp;gt;a# - Add: Adds the contents of buffer #.&amp;lt;br&amp;gt;p# - Pow: Returns the #th power of the value.&amp;lt;br&amp;gt;q# - Buffer Pow: Like Pow but uses the contents of buffer # as the exponent.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Add a tag &amp;quot;factoryHeadingTakeoff&amp;quot; (on request of the SWS folks to prevent some&amp;lt;br&amp;gt;clipping issues) which controls the takeoff behavior of TAAirMoveType aircraft.&amp;lt;br&amp;gt;True (default) means planes start matching their factory&#039;s heading right after&amp;lt;br&amp;gt;taking off from the pad, false means they maintain the heading of the pad&amp;lt;br&amp;gt;until reaching wantedHeight.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added [CONSTRUCTION] section to Modruless.tdf:&amp;lt;br&amp;gt;constructionDecay (bool, default true): Should constructions decay if noone is working on them?&amp;lt;br&amp;gt;constructionDecayTime (float, default 6.66): How long until the decay starts?&amp;lt;br&amp;gt;constructionDecaySpeed (float, default 0.03): The speed of the decay,&amp;lt;br&amp;gt;whereby buildTime*decaySpeed = time for a total decay so higher = slower decay&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added unit FBI collide tag (boolean, default: 1), currently affects only planes:&amp;lt;br&amp;gt;If set to 0 the plane will not collide with any other unit. Most notably this&amp;lt;br&amp;gt;saves the CPU-heavy collision checks every frame (big performance boost!) and&amp;lt;br&amp;gt;avoids the damage planes normally take from bumping into each other.&amp;lt;br&amp;gt;Projectiles will still collide with the units normally.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weapon definition tags==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added heightBoostFactor - a float tag that gives control of cannon height&amp;lt;br&amp;gt;range boost (more than 1 means increased range, 0 means the cannon has fixed&amp;lt;br&amp;gt;range regardless of height difference to target. default is a magic value&amp;lt;br&amp;gt;calculated on weapon init, based on range tag and theoretical max range.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added heightMod tag (height difference is multiplied by this value before&amp;lt;br&amp;gt;checking range), default 0.8 for Cannon weapon type, 0.2 for everything else&amp;lt;br&amp;gt;(i.e. stays as it was). Beamlasers have heightmod=1 by default so they use&amp;lt;br&amp;gt;pure spherical targeting.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GroundBounce, WaterBounce, NumBounce, BounceSlip, BounceRebound, and&amp;lt;br&amp;gt;bounceExplosionGenerator tags.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New tags beamttl (default: 0) and beamdecay (default: 1) for the beamlaser.&amp;lt;br&amp;gt;Beamttl defines the time (in frames) the beam will stay after being fired and&amp;lt;br&amp;gt;beamdecay defines the speed of the fadeout (each frame the beam&#039;s intensity is&amp;lt;br&amp;gt;multiplied with that value). This applies to the single-frame beams the weapon&amp;lt;br&amp;gt;emits, if it has a beamtime it will emit one such beam every frame, which is&amp;lt;br&amp;gt;only useful if the source of the beam moves a lot (gives a cool trail effect).&amp;lt;br&amp;gt;It&#039;s primarily intended for beams with a beamtime of one frame (which often&amp;lt;br&amp;gt;simulate very fast shots instead of constant streams, e.g. railguns) so they&amp;lt;br&amp;gt;don&#039;t disappear immediately.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added fixedLauncher tag (bool) for missiles, starburst missiles and torpedoes,&amp;lt;br&amp;gt;this makes the projectile spawn with the orientation of the shooting piece&amp;lt;br&amp;gt;instead of their normal orientation. The weapon will not properly check if&amp;lt;br&amp;gt;allies are in the way so make sure you align the launchers in a way that&amp;lt;br&amp;gt;won&#039;t hammer right into your own forces and perhaps use collideFriendly=0.&amp;lt;br&amp;gt;FixedLauncher conflicts with trajectoryHeight and IMO combining them is&amp;lt;br&amp;gt;pointless anyway so don&#039;t use both on a weapon.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added projectiles tag (int), each time a weapon fires this many projectiles&amp;lt;br&amp;gt;are spawned (on the same frame). Make sure you put them on different&amp;lt;br&amp;gt;trajectories somehow (sprayangle or different firepoints) because otherwise&amp;lt;br&amp;gt;they&#039;ll all be clumped in one shot. Can be set to 0 as well for script trigger&amp;lt;br&amp;gt;weapons and can be combined with burst.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Missiles and starburst missiles now obey smoketrail, set it to 0 to disable&amp;lt;br&amp;gt;the smoke. To get a missile without smoketrail you have to define the weapon&amp;lt;br&amp;gt;as a missile with WeaponType=MissileLauncher in the tdf.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Missiles, starburst missiles and torpedoes now use flighttime if present&amp;lt;br&amp;gt;instead of the hardcoded formula (which is still used if flighttime is not&amp;lt;br&amp;gt;present)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added SubMissile tag (bool) for TorpedoLaunchers, if set to 1 the torpedo will&amp;lt;br&amp;gt;travel like a missile outside of water. It will not emit a smoketrail, though.&amp;lt;br&amp;gt;When fired from a plane it will behave the same way but the plane will&amp;lt;br&amp;gt;probably be considered a fighter, not a bomber.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added fireSubmersed tag (bool), defaults to the value of waterweapon. If set&amp;lt;br&amp;gt;the weapon can fire underwater, if not then not. Use it for weapons that&amp;lt;br&amp;gt;cannot fire underwater but can hit underwater targets. Works even for&amp;lt;br&amp;gt;torpedoes.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Starburst missiles now obey turnrate for the turn at the peak of their flight&amp;lt;br&amp;gt;(if supplied, otherwise the old value is used).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; All weapons (save for the Rifle which noone uses anyway) can now attack&amp;lt;br&amp;gt;underwater targets if they have waterweapon=1 set.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Bombs can use manually defined burst and burstrate values instead of&amp;lt;br&amp;gt;autogenerated ones by using the new manualBombSettings tag (bool). Keep in&amp;lt;br&amp;gt;mind that (roughly) burst*burstrate defines the area in which the bomber is&amp;lt;br&amp;gt;willing to drop the bomb so if you make it too small the bomber might miss&amp;lt;br&amp;gt;the drop area and not drop any bomb.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added myGravity tag (float) for ballistic weapons (Cannon and Bomb), it&amp;lt;br&amp;gt;overrides the map gravity if used. Regular map gravity is around 0.2.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Bombs now obey Accuracy and SprayAngle.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added ShieldStartingPower tag (float) for shields, if set the shield starts&amp;lt;br&amp;gt;with this much power instead of 0.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed flareEfficency -&amp;gt; flareEfficiency.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the weaponDef &#039;cameraShake&#039; tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the dance tag for missilelaunchers that makes the missile move around&amp;lt;br&amp;gt;randomly. Unlike wobble it doesn&#039;t rotate the missile and it prevents the&amp;lt;br&amp;gt;missile from going too far off course so a dancing swarm will remain coherent.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Beamlasers ignore beamtime if new tag &amp;quot;beamburst&amp;quot; is set. (for emulating&amp;lt;br&amp;gt;weapons that do damage in bursts)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon FBI tags:&amp;lt;br&amp;gt;WaterBounce and GroundBounce: (default: false)&amp;lt;br&amp;gt;Boolean to allow a projectile to bounce off of a surface.&amp;lt;br&amp;gt;BounceSlip: (default: 1)&amp;lt;br&amp;gt;Amount of lateral speed kept by the projectile after it bounces.&amp;lt;br&amp;gt;BounceRebound: (default: 1)&amp;lt;br&amp;gt;Amount of vertical speed keeps and reverses.&amp;lt;br&amp;gt;NumBounce: (default: -1)&amp;lt;br&amp;gt;The number of bounces a weapon will make. -1 indicates no limit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the ability to bounce for Torpedos, Missiles, Lasers, Cannons, and Emgs.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added bounceExplosionGenerator tag, which defines an explosion generator to&amp;lt;br&amp;gt;run when a projectile bounces.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the tag &amp;quot;hardStop&amp;quot; (bool, default 0) which, if used, makes the laser not&amp;lt;br&amp;gt;fade if it doesn&#039;t hit before hitting its range limit and instead has the&amp;lt;br&amp;gt;laser stop immediately and contract, as if it had hit something. This looks&amp;lt;br&amp;gt;better with really long lasers, especially those that are longer than their range.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Weapon projectiles can now spawn a CEG at their position every frame using&amp;lt;br&amp;gt;the cegTag weapon tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ProximityPriority tag - acts as a multiplier for the distance to the target&amp;lt;br&amp;gt;in the priority calculation. Note that negative values make weapons prefer&amp;lt;br&amp;gt;distant targets.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Adds three opcodes to the CEG definitions:&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; m (modulo or sawtooth wave) returns the remainder of the running value&amp;lt;br&amp;gt;divided by m&#039;s parameter (100 m24 returns 4),&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; s (sine) returns the sine of the running value with the parameter acting as&amp;lt;br&amp;gt;the amplitude,&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; k (discrete) returns the running value floored to an integral multiple of&amp;lt;br&amp;gt;the parameter.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; All weapon projectiles that have a TTL now supply their remaining ttl-value as&amp;lt;br&amp;gt;the damage param to their trail CEG (Flame projectiles use curTime instead).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added alwaysVisible weapon tag, makes the projectile visible, even without LOS.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the weapon tag leadLimit that limits the maximum distance a unit will&amp;lt;br&amp;gt;lead a target (default is -1 which means infinite).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the weapon tag leadbonus which is multiplied with the unit&#039;s experience&amp;lt;br&amp;gt;and added to the lead limit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the weapon tag predictBoost (default 0 for non-burnblow, 0.5 for&amp;lt;br&amp;gt;burnblow weapons).&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed cannons not able to shoot as far from high ground as they should.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed infinite lower cylinder when cylindertargetting is active.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Loaded air transports no longer land on stop command .&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixes in glBallisticCircle. (use heightmod also in drawing range circles.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring now returns 0 when started with -V, -h or -p.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix random start positions. (positions are handed out before gaia team is added)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; CMD_REMOVE also works for idle factories (with move/patrol queues)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed Cannon::GetRange2D so it uses something closer to real-world physics.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Melee weapon always aiming west.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Do not allow commands with out-of-map destinations.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Connecting to server&amp;quot; message now does not pop up when starting without startscript.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Commandline is now parsed before the filesystemhandler starts up (speedup&amp;lt;br&amp;gt;starting with arguments like -V or -h).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed builders with area reclaim sometimes going out of their designated circle&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Bombs now obey Accuracy and SprayAngle.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed lightning weapons having a hardcoded inaccuracy, made it obey accuracy&amp;lt;br&amp;gt;and sprayangle tag instead.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Lightning weapons not doing damage to shields.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Possible fix for the disappearing healthbars.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crashbug when exiting the GroupAI, sharing and quit boxes in an unusual way.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed starburst missiles so they stop their engines after they travel out of range.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a possible load/save bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash in DamageArray() copying constructor.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t say &#039;content error&#039; if modrules.tdf isn&#039;t found.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved error reporting in GetTDFName and LoadMap.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed replays.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed savefiles on non-Windows OSes.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the run-time Spring.MakeFont() call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed beamlasers so they don&#039;t ignore CollideFriendly.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed both CollideFeature and CollideFriendly for weapontype=Rifle.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed unloading of aircraft.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash when sharing units with a GroupAI other player doesn&#039;t have.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed .team, .setminspeed and .setmaxspeed when playing a demo locally.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix groundscars turning white after using LOS overlays or enabling shadows.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Better error reporting in case of global AI version mismatch.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix SM3 when resizing windows.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t profile the water renderer on voidwater maps.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Weapons now use AimFromWeapon to determine the part to aim from, this prevents&amp;lt;br&amp;gt;waggling and failing to aim at close ranges. To simulate the old behaviour&amp;lt;br&amp;gt;make AimFromWeapon return the same piece as QueryWeapon does.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Melee weapon now reports a proper angle to AimWeapon.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made starburst missiles obey startvelocity and weaponacceleration.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Try to minimize damage caused by LuaUI crashes until cause is found by&amp;lt;br&amp;gt;disabling LuaUI after several errors happen.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Hackish fix for units sometimes not going to factory designated rally point&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Install the game/fonts/*.ttf files to fonts/.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Handle a missing argument to .skip a little better.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix error message for missing font.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Take screenshot of entire window (rather than left half only) in dual-screen mode.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Lua stack was changed to fix some segfaults.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Prohibit spectators (except for the host) from changing the gamespeed unless&amp;lt;br&amp;gt;cheating is enabled.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix an exploit where partially reclaimed corpses that are turned into wreckage&amp;lt;br&amp;gt;end up being worth more than the remaining value of the corpse itself.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix weaponAcceleration typo causing major bugs with nukes and vlaunch weapons et al.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix two &amp;quot;unknown net msg&amp;quot; errors in CPreGame when playing certain demos.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a crash bug  (lastColWarning == NULL) in TAAirMoveType.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a crash in AirMoveType.cpp.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed the automatic &#039;userInputPrefix&#039; tracking for incoming messages&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the unitsync GetUnitFullName().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Ignore used writing keypresses  (for bindings like:  &#039;bind a+u edit_next_word&#039;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixes a bug in LuaUnsyncedRead::TraceScreenRay() when using dualscreen mode&amp;lt;br&amp;gt;and minimap is on left.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unit pieces inherit alpha threshold from owner.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed jittery falling units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix timeout while loading / pathing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; CommandFallback was broken wrt return values, fixed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved dgun responsiveness. (still not perfect, but at least shoots through&amp;lt;br&amp;gt;features now)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Construct a proper orthonormal basis for muzzle-flame bitmaps.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Gracefully handle missing script failure.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed speed and pause in replay.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix for teleporting units when area-unloading out of map.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix for uadded tracking of PushMatrix and PopMatrix Lua call-ins to reduce&amp;lt;br&amp;gt;number of gl errors.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix ghosted buildings always being drawn with default facing.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed weapon TDF &#039;fireStarter&#039; tag, for all weapon types.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units, when they are within range, but unable to hit the target of an attack&amp;lt;br&amp;gt;command, will move sideways.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the bug where laserprojectiles had weird garbage on the front if the&amp;lt;br&amp;gt;projectile was within lod distance.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed set HEADING COB variable so it updates unit direction.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed giving commands while recording a video.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed bug where after load all moving ground units stops with message&amp;lt;br&amp;gt;&amp;quot;Can&#039;t reach destination&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix for patrolling builders repairing stuff that&#039;s being reclaimed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; In the tooltip displayed on mouseover, deconstructing nanoframes didn&#039;t show&amp;lt;br&amp;gt;how much metal they are producing on mouseover.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t set the default shareTeam to a dead team ever.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed random mod.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made glPrintOutlined() almost 50% faster by lowering quality.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Reclaimers list is now saved.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Now error messages are broadcast to all clients.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Paralyzers no longer damage features.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the wait/teleport factory bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix flying/underground units bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unhide the gaia team, and colorize by allegiance.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made demo not found / demo corrupt / format outdated exceptions instead of logOutput-warnings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; /quit will now quit immediately if you are the only active player.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a &#039;bad team&#039; segv in Spring.CreateUnit().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the ScopedMapLoader helper to unitsync.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Paralyzers no longer shake the camera.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the missile and starburst texture2 only applying to the first segment of&amp;lt;br&amp;gt;the smoketrail (the segment that&#039;s still part of the projectile, not a&amp;lt;br&amp;gt;CSmokeTrailProjectile). Now the entire trail uses the texture.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix possible segmentation faults after loading a shared object failed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed bug where server dont send remaining data (including NETMSG_QUIT) to server&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Set ACTIVATION issues CMD_ONOFF instead of activating/deactivating, fixing&amp;lt;br&amp;gt;issues with on/off not showing correct state.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a check for weapon &#039;slavedTo&#039; values  (content_error).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed some bugs in gl.TexEnv / gl.MultiTexEnv / gl.TexGen / gl.MultiTexGen&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Used the decoyDef ghost building models when appropriate.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed CAirMoveType planes not rotating on factory pads.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed CTAAirMoveType planes always taking off from labs facing south.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed missile-gunships from being unable to force-attack ground.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed CTRL-MOVE group orders causing units to move at snail&#039;s pace.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed mid-air explosions that occur over water triggering a water splash effect.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the isAttackCapable() check.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Prevent CMissileProjectile weapons with trajectoryHeight from over- or&amp;lt;br&amp;gt;undershooting when firing at targets below or above attack position.&amp;lt;br&amp;gt;Based the angular correction factor on missile speed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Not being able to lock the config file on linux is not a fatal error anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Remove the (bestDist &amp;lt; radius) bugs.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Make sure the (paralyzeDamageTime &amp;gt;= 0).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added bestDist method for all area searches.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a check for immobile builders that will stop internal.&amp;lt;br&amp;gt;commands for when the unit has moved out of the build range.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed FlareProjectile. (flare projectile was always removed after one Update.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow for &amp;quot;non-decloakable&amp;quot; units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; CGameHelper::GetClosestEnemyUnitNoLosTest() now includes the target&#039;s radius&amp;lt;br&amp;gt;for spherical tests.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Stunned factories don&#039;t open, build, or close.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Players from demo once again can&#039;t change speed / pause.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Factored out some glGetDoublev() calls (may be faster on certain GPU architectures)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed issue that some people can only get sound when hosting.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed bug in map damage loading from savegame.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed possible bug in explosions map damage.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash with saving after nuke was intercepted.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed ground-transports being unable to unload units on certain maps.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units that are still inside a non-firebase transport do not destun.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed units whose state is floating but are not in water taking water-damage.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Print &amp;quot;spectator &amp;lt;name&amp;gt; left&amp;quot; rather than &amp;quot;player &amp;lt;name&amp;gt; left&amp;quot; if the guy&amp;lt;br&amp;gt;leaving is a spectator.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added serializing for InMapDraw.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed bug with saving builders that terraform ground.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed stunned units being unhittable if pushed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made a seperate update thread while the game loads to prevent network timeouts&amp;lt;br&amp;gt;on slow computers. (thread is joined when loading finished.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; CCobInstance::RealCall now checks if stack is big enough before getting&amp;lt;br&amp;gt;arguments from stack.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; made StartBuilding measure the pitch from the center of the unit instead of&amp;lt;br&amp;gt;the base to deal with units with large vertical offset.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Put CMinimap always on back so it does not draw over the user interface.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Moved the QueryNanoPiece COB call into synced code to hopefully fix a desync.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the bug where a repair order on a construction whose terraforming is&amp;lt;br&amp;gt;incomplete will start construction anyway.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed units terraforming the ground under units being built by factories.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added some protection against .wav&#039;s whose headers contain a garbage datalen.&amp;lt;br&amp;gt;(was causing SEGV&#039;s with XTA 9.2)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Change lots of printf calls to logOutput.Print().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t send NETMSG_GAMEOVER when watching a demo with only 1 allyteam left.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Throw content_error if a mod/map archive can not be found instead of only&amp;lt;br&amp;gt;printing a warning in the log.  This should stop the &#039;missing default cursor&#039;&amp;lt;br&amp;gt;message actually meaning &#039;missing a mod archive&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added minimap ping on game start and set lastMsgPos to something meaningful.&amp;lt;br&amp;gt;Notably this fixes F3 zooming to top left corner before something interesting&amp;lt;br&amp;gt;happens.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash when singlestep was executed in client mode.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring and ArchiveMover.exe requires administrative privileges now on Windows,&amp;lt;br&amp;gt;as a workaround until user directories can be specified as data directories.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;Can&#039;t reach destination&amp;quot; message spam should be reduced a bit.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lua==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added call-in gl.Smoothing(point, line, polygon).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetViewSizes() to LuaOpenGL.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the SetLosViewColors()    call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the StockpileChanged()    call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the DefaultCommand()      call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the LuaUI WorldTooltip()  call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the LuaUI GameSetup()     call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetUnitHeight()           call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetFeatureHeight()        call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetFeatureRadius()        call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetFeatureResurrect()     call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added SetTeamColor()            call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetTeamColor()            call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetTeamOrigColor()        call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.SetDrawSky()   call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.SetDrawWater() call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.SetDrawGroud() call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the gl.UnitMultMatrix()   call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the GetLuaAIDesc() call.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.AddUnitDamage(&amp;lt;br&amp;gt;number unitID,&amp;lt;br&amp;gt;number damage,&amp;lt;br&amp;gt;number paralyzeTime,&amp;lt;br&amp;gt;number attackerID,&amp;lt;br&amp;gt;number weaponID,&amp;lt;br&amp;gt;number impulseX, number impulseXY, number impulseZ) lua call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the gl.UnitPieceMultMatrix() lua call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the gl.EdgeFlag() lua call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.GetCameraFOV()       lua call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.GetCameraDirection() lua call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added unit count protection to Spring.CreateUnit().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the DrawUnit() LuaRules unsynced call-in.  (for SetUnitLuaDraw())&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.SetUnitLuaDraw() LuaRules call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the GameFrame() call-in to LuaUI.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the AICallIn() LuaRules unsynced call-in.  (for CallLuaRules())&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.GetTeamLuaAI() lua call-out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaUI Spring.GetGatherMode().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaUI Spring.GetInvertQueueKey().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetUnitLineage(unitID, teamID[, bool isRoot]).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetBuildFacing() for LuaUI.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetBuildSpacing() for LuaUI.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed the color info from GetTeamInfo().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetHasLag(), returns true if currently lagging behind host.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added PlaySoundStream and StopSoundStream for OggVorbis audio.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the rank parameter to GetPlayerInfo().  (arg 7)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;autoland&#039; to GetUnitStates().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the UnitCmdDone()   call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the UnitCloaked()   call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the UnitDecloaked() call-in.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Adedd the MapDrawCmd()    call-in.  (only for LuaUI)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the unsynced Spring.GetVisibleUnits([teamID] [,radius] [,useIcons]) call-out&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following to both UnitDefs[] and FeatureDefs[]&amp;lt;br&amp;gt;height, radius&amp;lt;br&amp;gt;minx, midx, maxx&amp;lt;br&amp;gt;miny, midy, maxy&amp;lt;br&amp;gt;minz, midz, maxz&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Disabled the lua DrawScreen() call-in when the interface is hidden. (note that&amp;lt;br&amp;gt;the DrawScreenEffects() call-in remains active.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; The majority of mod files are now loaded via LuaParsers, which can be edited&amp;lt;br&amp;gt;to load different types of files. The default LuaParsers simply load the&amp;lt;br&amp;gt;normal style files with improved error checking and speed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Game.armorTypes[] was changed to a bidirectional map.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; WeaponDefs[x].damages.damages[] was replaced with WeaponDefs[x].damages[index]&amp;lt;br&amp;gt;(starts at 0 for the default armorType)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &#039;teamcolors.lua&#039; local team recoloring LuaParser script.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the gui_game_setup.lua GameSetup widget.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;ghostedBuildings&#039; to Game[].&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed Game.modName to use the humanName value.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; UnitDef names are always lower case now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added on-the-fly lua font texture / specfile generation.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added localization support in the lua tooltips and ctrlpanel.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Generated local speed-ups for some of the installed widgets.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Created FeatureDefNames and WeaponDefNames for LuaUI.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.SetUnitNeutral(unitID, bool) and Spring.GetUnitNeutral(unitID).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Neutral units (mainly for gaia and fake features), will not be attacked.&amp;lt;br&amp;gt;automatic when the attacker to be has its fireState set to &amp;quot;Fire At Will&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a hidden fourth fireState level (3) that will shoot at neutrals.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added SetCustomCommandDrawData.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;extractorRadius&#039; to the LUA Game table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.IsGodModeEnabled() to LuaSyncedRead.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;gamedata/LockLuaUI.txt&amp;quot; check for LuaUI. If this file exists in&amp;lt;br&amp;gt;the mod, then LuaUI can only load its gui.lua&amp;quot; file from the archive&amp;lt;br&amp;gt;filesystem, thus putting the mod in full control of what LuaUI can be used&amp;lt;br&amp;gt;to do  (including disabling all user widgets).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; LuaAI is now supported.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added custom mod / map options via Lua:&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; MapOptions.lua is to be used with LuaGaia, and belongs in the map archive,&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; ModOptions.lua is to be used with LuaRules, and belongs in the mod archive.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed cmdDesc  iconname  -&amp;gt; texture  for LuaUI LayoutButtons() input.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed cmdDesc  mouseicon -&amp;gt; cursor   for LuaUI LayoutButtons() input.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed the cmdDesc double texture format to:&amp;lt;br&amp;gt;&#039;&amp;amp;&amp;lt;xscale&amp;gt;x&amp;lt;yscale&amp;gt;&amp;amp;&amp;lt;tex1&amp;gt;&amp;amp;&amp;lt;tex2&amp;gt;&#039;&amp;lt;br&amp;gt;(both textures can use either the named textures or &#039;#&amp;lt;unitDefID&amp;gt;&#039; format)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; * Added the Spring.RequestPath() lua call-out&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; RequestPath(&amp;lt;number moveID | string moveName&amp;gt;,&amp;lt;br&amp;gt;startX, startY, startZ, endX, endY, endZ [, goalRadius]) -&amp;gt; nil | path&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; it returns a lua userdata or nil&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; the userdata has the following calls:&amp;lt;br&amp;gt;path:Next([currX, currY, currZ[, minDist]]) -&amp;gt; nil | x, y, z&amp;lt;br&amp;gt;path:GetEstimatedPath() -&amp;gt;&amp;lt;br&amp;gt;{[1] = {x,y,z}, [2] = {x,y,z}, etc... }, -- waypoints&amp;lt;br&amp;gt;{[1] = index,   [2] = index,   etc... }  -- resolution start points&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Spring.GetUnitEstimatedPath() -- same return as path:GetEstimatedPath()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetEstimatedPoints() to CPathManager&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the NETMSG_LUAMSG net packet type&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following calls to LuaUI:&amp;lt;br&amp;gt;Spring.SendLuaUIMsg(msg [,mode = &#039;&#039;|&#039;a&#039;|&#039;allies&#039;|&#039;s&#039;|&#039;specs&#039;])&amp;lt;br&amp;gt;Spring.SendLuaCobMsg(msg)&amp;lt;br&amp;gt;Spring.SendLuaGaiaMsg(msg)&amp;lt;br&amp;gt;Spring.SendLuaRulesMsg(msg)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the RecvLuaMsg(msg, playerID) call-in to all lua scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the weaponID to the lua UnitDamaged() for fullRead scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed imageSizeX and imageSizeY  (potential desync). The gl.TextureInfo() call can be used instead&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made decloakDistance a per-unit property, and made it accessible to&amp;lt;br&amp;gt;synced lua scripts as the third parameter to SetUnitCloak().&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetModOptions() and GetMapOptions()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added UnitSeismicPing()  (with a sound)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the ability to set the stockpile percent&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.SetUnitTarget(unitID, targetID | &amp;lt;x,y,z&amp;gt;, bool userTarget) call-out&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.SetExperienceGrade(number) call-out (sets the experience&amp;lt;br&amp;gt;steps that will trigger the UnitExperience() call-in, based on the&amp;lt;br&amp;gt;limExperience varible value  (exp / (exp + 1)))&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the UnitExperience() lua call-in&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added VFS.UseArchive(filename, function(...) ... end, ...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allows for packaged widgets (source, textures, sounds, etc...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; currently only works for raw filesystem access (limited to LuaUI)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following lua call-outs to allow unsynced read access to COB global variables:&amp;lt;br&amp;gt;GetCOBUnitVar(unitID, varID)&amp;lt;br&amp;gt;GetCOBTeamVar(teamID, varID)&amp;lt;br&amp;gt;GetCOBAllyTeamVar(allyTeamID, varID)&amp;lt;br&amp;gt;GetCOBGlobalVar(varID)&amp;lt;br&amp;gt;(varIDs start at 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added FBO objects to lua GL, with MRT (multiple render targets) capability, and blitting&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added RBO objects to lua GL, which should allow for depth + stencil format&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added lua Scream objects, which can call a function when they are garbage collected&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added VFS.SubDirs(), to get a list of subdirectories&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Spring.SendMessage() and friends can now be used by unsynced lua code&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Lua SyncedCtrl function Spring.SetUnitMoveGoal(unitID, posX, posY, posZ[, radius[, speed]]),&amp;lt;br&amp;gt;this makes the unit move closer to the target location, to a distance of &amp;lt;radius&amp;gt; (default 0).&amp;lt;br&amp;gt;This is mostly for custom commands that should have the unit moving into range,&amp;lt;br&amp;gt;it doesn&#039;t affect the order queue. It&#039;s marked as unsafe.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New Lua call-out (SyncedCtrl): Spring.SetUnitWeaponState(unitID, weaponNum, stateTable)&amp;lt;br&amp;gt;StateTable is a table containing one or more of reloadstate, reloadtime (this time in seconds),&amp;lt;br&amp;gt;accuracy, sprayangle, range, projectilespeed. Obviously the values will be assigned to the&amp;lt;br&amp;gt;variables the keys refer to.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.GetMapList() call-out to the mod ValidMaps.lua script&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the Spring.GetMapInfo() call-out for the ValidMaps.lua script&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added mapSizeX and mapSizeZ to the lua Game table&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix GetCmdDescIndex()&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a seventh parameter to AllowCommand, &amp;quot;synced&amp;quot;. It&#039;s a bool that is true&amp;lt;br&amp;gt;when the command was sent by either a Spring-internal action or synced Lua and&amp;lt;br&amp;gt;it&#039;s false if the command came from the user or LuaUI. This should facilitate&amp;lt;br&amp;gt;preventing user commands to a unit while allowing LuaRules commands.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed the third return value of Spring.GetTeamInfo (active) since it was broken.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
COB&lt;br /&gt;
*&amp;lt;span&amp;gt; Give a COB error instead of crashing for invalid explosion generator indices&amp;lt;br&amp;gt;or weapon indices in emit-sfx. #&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB call to &amp;quot;ShotX&amp;quot; that happens shortly before weaponX uses&amp;lt;br&amp;gt;QueryWeaponX, use this for switching firepoints in bursts or when using&amp;lt;br&amp;gt;multiple projectiles.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; StartBuilding now supplies the pitch as the second parameter to help with&amp;lt;br&amp;gt;custom build FX.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed cob bitwise not operator (was logical not.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a MOD COB opcode for modulo division&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Introduces the COB get/set variable 103, ALPHA_THRESHOLD. It ranges from 0-255&amp;lt;br&amp;gt;and changes the glAlphaFunc to use that alpha value as its minimum. In&amp;lt;br&amp;gt;practice this allows disintegration-style effects or the reverse for build animations.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Transport AI now calls the cob function &#039;StartUnload&#039; which is called once&amp;lt;br&amp;gt;when transport starts to lower during land flood method.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Dropped units call the cob functions &#039;falling&#039; and &#039;landed&#039; so that you may&amp;lt;br&amp;gt;start and stop a parachute animation.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &#039;cobID&#039; unitDef tag, and the COB_ID (100) COB GET type&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the BlockShot#(unitID, block) COB call-in  - set block to non-zero to&amp;lt;br&amp;gt;block the unit firing at unitID&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the cob GET/SET STEALTH command  (96)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added CRASHING (97) get/set constant to COB. Can be used to get/set whether an&amp;lt;br&amp;gt;aircraft is crashing. Is ignored for non-CAirMoveType units.&amp;lt;br&amp;gt;(including CTAAirMoveType aircraft)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added global, team, and ally GET/SET variables to COB scripts&amp;lt;br&amp;gt;1024 - 2047:  1024 global variables&amp;lt;br&amp;gt;2048 - 2175:  128  variables per team      (the COB script unit&#039;s team)&amp;lt;br&amp;gt;2176 - 2303:  128  variables per allyteam  (the COB script unit&#039;s allyteam)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added 8 shared per-unit variables   (example: GET UNIT_VAR_START -unitID value)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the SET_WEAPON_UNIT_TARGET (106) and SET_WEAPON_GROUND_TARGET (107)&amp;lt;br&amp;gt;COB GET codes  (used GET because of its extra parameters)&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt;  GET  SET_WEAPON_UNIT_TARGET    weaponID  unitID          userTarget&amp;lt;/span&amp;gt;&lt;br /&gt;
::*&amp;lt;span&amp;gt;  GET  SET_WEAPON_GROUND_TARGET  weaponID  xzCoord yCoord  userTarget&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added TargetWeightX COB call-in and CHANGE_TARGET cob set var.&amp;lt;br&amp;gt;COB call-in TargetWeightX(targetID, weight), weight defaults to 65536 which&amp;lt;br&amp;gt;represents 1.0 and is multiplied with the target&#039;s value to determine priorities.&amp;lt;br&amp;gt;Set CHANGE_TARGET to Y makes weaponY pick a new target.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Adds the COB set constant CEG_DAMAGE (99), which defines the damage value for&amp;lt;br&amp;gt;all CEGs triggered by emit-sfx 1024 + x to allow for some variability in the&amp;lt;br&amp;gt;emitted effects (to e.g. make a charging energy ball grow larger or have smoke&amp;lt;br&amp;gt;get progressively darker as the unit&#039;s HP decreases).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a new get call, PLAY_SOUND, to play a sound that can be heard only by&amp;lt;br&amp;gt;allies, enemy, in los, etc. GET PLAY_SOUND(sound number, volume,&amp;lt;br&amp;gt;who hears the sound, where to play the sound) (see r4974 for full docs)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Get health now allows a unit ID to be passed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB and Lua access to some more weapon variables.&amp;lt;br&amp;gt;New COB constants, all get-only (but not read-only):&amp;lt;br&amp;gt;WEAPON_RELOADSTATE 125 (frame number of the next shot/burst)&amp;lt;br&amp;gt;WEAPON_RELOADTIME 126 (in frames)&amp;lt;br&amp;gt;WEAPON_ACCURACY 127&amp;lt;br&amp;gt;WEAPON_SPRAY 128&amp;lt;br&amp;gt;WEAPON_RANGE 129&amp;lt;br&amp;gt;WEAPON_PROJECTILESPEED 130&amp;lt;br&amp;gt;All of these use the first param (starting at 1) as the weapon index whereby positive&amp;lt;br&amp;gt;means read and negative means write the second param to the value. In the latter case&amp;lt;br&amp;gt;the previous value is returned.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New COB GET/SETS&amp;lt;br&amp;gt;FLANK_B_MODE         120 // set or get&amp;lt;br&amp;gt;FLANK_B_DIR          121 // set or get, set is through get for multiple args&amp;lt;br&amp;gt;FLANK_B_MOBILITY_ADD 122 // set or get&amp;lt;br&amp;gt;FLANK_B_MAX_DAMAGE   123 // set or get&amp;lt;br&amp;gt;FLANK_B_MIN_DAMAGE   124 // set or get&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.75b2=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed possible crash while waiting for connection to the host.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed unknown net msg in read ahead bugs when large UDP packets were received.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a crash when empty network packets where destructed.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed rapier like units being unable to attack enemy units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; TargetBorder now takes the correct vertical distance into account.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;.kick&amp;quot; and &amp;quot;.kickbynum&amp;quot; now just kick the given player instead of kicking&amp;lt;br&amp;gt;everyone including the host himself.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Game end condition is now fixed to check allyteams instead of teams.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gui_xray_shader.lua widget&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added gui_team_platter.lua widget&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added camera_smooth_move.lua widget&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.75b1=&lt;br /&gt;
&lt;br /&gt;
==Uncategorized==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaCob, LuaGaia, LuaRules synchronized scripting:&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; LuaCob:   (mod)  provides access to lua functions for COB scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; LuaGaia:  (map)  controls the Gaia team&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; LuaRules: (mod)  gives full read/ctrl to setup custom mod game rules&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaRules Spring.UnitRendering (LuaMaterials, unfinished).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Merged the LuaUI code with the new lua library setup.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made LuaUI mod widgets possible.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added support for the Gaia team.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added SimpleGroundFlash to explosion generator.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;dds&#039; and &#039;png&#039; as default buildpic formats.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Load/save now uses the creg serializer.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Netcode has been refactored to be more readable.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==AI==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Load/Save interface for AIs.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Load/save support for EconomyAI and MexUpgraderAI.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetStartPos to IAICallback.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed CCommandQueue in AI interface.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added AIVAL_UNITLIMIT enabling AIs to query the maximum number of units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the ability to unload a specific unit using the UNLOAD_UNIT command&amp;lt;br&amp;gt;(the unitID should be added as the fourth parameter)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added AIVAL_STOCKPILED to query the amount of stockpiled ammo.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added AIVAL_STOCKPILE_QUED to query the amount of queued stockpile ammo.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Behavorial==&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow up to 16 pads per air base.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units can not build stuff on top of cloaked stuff anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units guarding other units now properly repair the other unit if it&#039;s damaged.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units guarding factories prioritize repairing the factory instead of building&amp;lt;br&amp;gt;new units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Stunned (and transported) units can not build anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units (that are still paralyzed) are not un-stunned anymore during unloading.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed the unit resource updates so that they occur even while stunned.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Transporters can carry hovers and ships now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Transporters now check ground slope before unloading.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units on a slope steeper than their max slope will now skid down it.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Disabled the ground flattening when building mobile units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added paralyzed unit skipping for paralyzers.&amp;lt;br&amp;gt;(use ALT to disable skipping, same modifier as for permanent area commands)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made a unit&#039;s ablity to slow itself relative to the angle of the slope.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved aiming of Cannon type weapons. They will no longer over/under shoot&amp;lt;br&amp;gt;due to large height differences.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Weapons don&#039;t target dead and crashing units anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Mobile units under hold position in a temporary attack order don&#039;t move away&amp;lt;br&amp;gt;from their patrol route anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added ScriptMoveType (incomplete, but functional).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Commander doesn&#039;t randomly D-gun buildings anymore when FPS mode is disabled.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Missiles now honour SprayAngle weapon TDF tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugfixes==&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed the maximum 8 sides limit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed incorrect searching order in the virtual file system.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed teamcolor for S3O and 3DO features.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed cloaked S3O units losing their texture.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed teamcolor rendering for MissileProjectile and WeaponProjectile.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed handling of .give so team unitlimit is respected.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Dynamic and refractive water are now reinitialized after window resize.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed rendering of shadows of S3O models with transparency.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed rendering of underwater grass.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made LuaUI compatible with VFS access.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed SM3 shader for ATI x1* series.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed incorrect cancelling of rotated buildings build orders.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; And many more&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Chat commands==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added an optional [0|1] parameter to the pause command.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added an optional [0|1] parameter to the showHealthBars command.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added an optional [0|1] parameter to the updatefov command.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added an optional [0|1] parameter to the drawtrees command.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added an optional [0|1] parameter to the dynamicsky command.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added an optional [0|1] parameter to the hideinterface command.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;.editdefs [0|1]&amp;quot; to allow lua based UnitDef editing.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;.reloadcob &amp;lt;unitName&amp;gt;&amp;quot; to reload cob scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;.skip &amp;lt;[+|f]seconds&amp;gt;&amp;quot; for in-game and replay fast-forwarding.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/safegl [0|1]&amp;quot; command for testing lua rendering overhead.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/buffertext &amp;lt;text&amp;gt;&amp;quot;, copies text into the console history.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added dynamic &amp;quot;/vsync&amp;quot; control.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;/fpshud [0|1]&amp;quot; action.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;endgraph [0|1]&amp;quot; action.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed &amp;quot;.take&amp;quot; so that cheating must be enabled for spectators to use it.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the ability to give features using &amp;quot;.give&amp;quot;&amp;lt;br&amp;gt;(only if the unit name doesn&#039;t match, player&#039;s team is used)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added input text editing&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; backspace &amp;amp; delete&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; home &amp;amp; end  (or ALT+{left|right})&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; CTRL+{left|right} for word skipping&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &#039;//&#039; -&amp;gt; &#039;/&#039; command prefix conversion syntax&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following LuaUI widget handler commands:&amp;lt;br&amp;gt;&amp;quot;/luaui togglewidget  &amp;lt;widgetname&amp;gt;&amp;quot;&amp;lt;br&amp;gt;&amp;quot;/luaui enablewidget  &amp;lt;widgetname&amp;gt;&amp;quot;&amp;lt;br&amp;gt;&amp;quot;/luaui disablewidget &amp;lt;widgetname&amp;gt;&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &#039;/lodscale [shadow|reflection|refraction] &amp;lt;scale&amp;gt;&#039; command.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==COB==&lt;br /&gt;
*&amp;lt;span&amp;gt; HitByWeaponId(z,x,id,damage) will be called instead of HitByWeapon if it exist&amp;lt;br&amp;gt;in script.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Implemented COB get/set constant STANDINGMOVEORDER (2)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Implemented COB get/set constant STANDINGFIREORDER (3)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a new COB query call, &amp;quot;QueryLandingPadCount&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; if not defined, Spring will assume 16 as the maximum number of pads&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; it takes one argument, which is initially set to 16, the number&amp;lt;br&amp;gt;returned in arg0 will be used as the maximum number of pads.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed logical XOR,AND,OR (they were implemented as binary XOR,AND,OR)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant UPRIGHT (79)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get constant POW (80) with 2 arguments x and y: it returns x^y.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get constant PRINT (81) which prints it&#039;s 4 arguments to infolog.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get constant HEADING (82)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get constant TARGET_ID (83)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get constant LAST_ATTACKER_ID (84)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant LOS_RADIUS (85)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant AIR_LOS_RADIUS (86)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant RADAR_RADIUS (87)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant JAMMER_RADIUS (88)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant SONAR_RADIUS (89)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant SONAR_JAM_RADIUS (90)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant SEISMIC_RADIUS (91)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get constant DO_SEISMIC_PING (92)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant CURRENT_FUEL (93)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get constant TRANSPORT_ID (94)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constant SHIELD_POWER (95)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added COB get/set constants LUA0-LUA9 (110-119)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Config==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;SMFTexAniso&amp;quot; config parameter (default = 0, disabled)&amp;lt;br&amp;gt;(application controlled anisotropic texture filtering for SMF maps)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed &amp;quot;SM3MaxTextureStages&amp;quot;, it&#039;s confusing and the fallback mode isnt&amp;lt;br&amp;gt;really useful (still slow).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added config parameter MaximumTransmissionUnit. This can be used to control&amp;lt;br&amp;gt;the maximum UDP packet size Spring uses. The default is 512, which should keep&amp;lt;br&amp;gt;all UDP packets below the required minimum MTU of 576 bytes (512 payload).&amp;lt;br&amp;gt;If the hypothese that many player drops are because of too big UDP packets is&amp;lt;br&amp;gt;correct, then this may solve it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Feature TDF tags==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean feature TDF tag NoSelect. (default: 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fixed exploits==&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed exploit: UnitRestricted could be circumvented by making multiple&amp;lt;br&amp;gt;factories and starting a build of the restricted unit in all factories at&amp;lt;br&amp;gt;the same time.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed exploit: CanAssist could be circumvented if multiple builders were&amp;lt;br&amp;gt;ordered an identical build at the same time out of their immediate range.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed exploit: Aircraft can not cross map boundaries anymore in FPS mode.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Game Setup==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;lineage&#039; game mode (2). If the commander dies, all units directly or&amp;lt;br&amp;gt;indirectly built by him die, regardless of the current owner of the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added player &#039;CountryCode&#039; tag for the gameSetup script.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added game setup script parameter &#039;Savefile&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; SaveGame can also be loaded by command line: &#039;spring QuickSave.ssf&#039; or&amp;lt;br&amp;gt;&#039;spring C:\Spring\Saves\QuickSave.ssf&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added NoHelperAIs tag: determines whether helper AIs are allowed.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaGaia tag: is LuaGaia enabled this game?&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaRules tag: is LuaRules enabled this game?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==GUI==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added land at 80% for aircraft.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Better handling and display of widgets which are enabled, but not active.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Disable unit tracking when using middle mouse button scrolling.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Disable unit tracking when the viewport is set via the minimap.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New unit selection filter &amp;quot;in hotkey group&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units being transported can not be selected anymore unless the transporter&amp;lt;br&amp;gt;isfireplatform.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Mobile units can be loaded onto a transport by clicking on the transport with&amp;lt;br&amp;gt;the mobile unit selected.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Free camera mode (to help make better videos). It&#039;s primarily intended&amp;lt;br&amp;gt;to be used with keyboard input (CTRL/ALT/SHIFT/META behave differently then&amp;lt;br&amp;gt;the normal camera modes). It&#039;s is not in the toggle list by default.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added CTRL+F5 default keybinding for free camera mode.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added text coloring for ally and spec message input.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed unit sharing so that allied units do not clear their command&amp;lt;br&amp;gt;queue, and cleaned up some more state for enemy transfers.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allowed build command descriptions to use text in the 4 corners of a button&amp;lt;br&amp;gt;(0 = SW, 1 = NE, 2 = NW, 3 = SE)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;hotspot&amp;quot; command for the *.txt mouse cursor spec file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added side preference prefix for start pictures.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Allow &amp;quot;allside_&amp;quot; start pictures to always be used (regardless of side).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; FPS mode now shows weapon names instead of numbers.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Area build now builds every second row in the opposite direction.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Perimeter build now builds everything in clockwise or counterclockwise order.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Circle build now builds everything in clockwise or counterclockwise order.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Circle build now works correctly when trying to use non-square buildings for&amp;lt;br&amp;gt;circling anything.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved QuitBox player selection visibility.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Gunships and air builders now have a repair level switch.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mapping==&lt;br /&gt;
*&amp;lt;span&amp;gt; New ocean.jpg (public domain) comes from golgotha texture set and tiles better&amp;lt;br&amp;gt;then original ocean.jpg.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed default repeat settings so the new texture fits better (wrt. scale)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;MAP\WATER\WaterRepeatX&amp;quot; and &amp;quot;MAP\WATER\WaterRepeatY&amp;quot; SMD tags, defining&amp;lt;br&amp;gt;the amount of times the water texture should be repeated in X and Y direction.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Aspect ratio of water texture is taken into account now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;gamedata/resources_map.tdf&#039; for gaia unit projectile textures.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit FBI tags==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag AirStrafe.  Only effective if HoverAttack=1.&amp;lt;br&amp;gt;If AirStrafe=1, gunships and construction aircraft will strafe in a circle&amp;lt;br&amp;gt;around the target. If AirStrafe=0, they will not strafe, they will sit&amp;lt;br&amp;gt;stationary in the air firing their weapons. If set to 0 they sit at one place.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added string FBI tag Gaia.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added string FBI tag DecoyFor: the name of the unit this one is a decoy for.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag CanBeAssisted. (default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; Disabling assists to factories should work well.&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; Builders have to die to release their hold on a unit being built,&amp;lt;br&amp;gt;and once the unit is released, multiple builders can repair the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag CanSelfRepair. (default: 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag TransportByEnemy. (default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag HoldSteady, causes transports to hold units such that&amp;lt;br&amp;gt;their updirs are always aligned.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag ReleaseHeld for transports. When set to 1, the units&amp;lt;br&amp;gt;carried by the transport will survive the destruction of the transport itself.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag SlideTolerance, multiplies the the max slope for&amp;lt;br&amp;gt;determining when skidding should begin, due to slope. Values less than 1 will&amp;lt;br&amp;gt;cause the unit to never start skidding due to slope. (default: 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag MinCollisionSpeed, indicating the minimum net impact speed&amp;lt;br&amp;gt;that will cause damage to a unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added vector FBI tag CollisionSphereOffset&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag LoadingRadius&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag FullHealthFactory, controls whether or not a unit can&amp;lt;br&amp;gt;leave the factory if it is not at full health. (default: 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag RepairSpeed (default: WorkerTime)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag ReclaimSpeed (default: WorkerTime)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag ResurrectSpeed (default: WorkerTime)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag CaptureSpeed (default: WorkerTime)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag TerraformSpeed (default: WorkerTime)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean FBI tag DecloakOnFire (default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Up to 8 ok, select and arrived sounds can now be defined.&amp;lt;br&amp;gt;(use tags ok1, ok2, etc.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float FBI tag CollisionSphereScale, this is a scaling factor for the&amp;lt;br&amp;gt;unit&#039;s collision sphere. (default: 0.5 for aircraft, 1 for other units)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weapon TDF tags==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added weapon tdf command SweepFire, if 1 (default 0) it will make the weapon&amp;lt;br&amp;gt;continue firing while it aims for a new target. Only works on continous beam&amp;lt;br&amp;gt;lasers currently.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean weapon TDF tag CanAttackGround. (default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag float TargetBorder: if nonzero, targetting units&amp;lt;br&amp;gt;will TryTarget at the edge of collision sphere (radius*tag_value, [-1;1])&amp;lt;br&amp;gt;instead of its centre. Defaults to 1 for Melee type weapons, 0 otherwise.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag CylinderTargetting: if greater than 0, range will&amp;lt;br&amp;gt;be checked in a cylinder (half height=unitradius*cylinderTargetting) instead&amp;lt;br&amp;gt;of a sphere. Defaults to 1 for Melee type weapons, 0 otherwise.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag MinIntensity: for beamlasers - always hit with some&amp;lt;br&amp;gt;minimum intensity (a damage coeffcient normally dependent on distance).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag SizeDecay: how much a plasma particle is smaller&amp;lt;br&amp;gt;than the previous within the same plasma shot. (default: 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag AlphaDecay: how much a plasma particle is more&amp;lt;br&amp;gt;transparent than the previous particle. (default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag Separation: distance between each plasma particle.&amp;lt;br&amp;gt;(default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added int weapon TDF tag Stages: number of particles used in one plasma shot.&amp;lt;br&amp;gt;(default: 5)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean weapon TDF tag NoGap: if set to 1, the distance between plasma&amp;lt;br&amp;gt;particles is proportional to the size of the two particles. If set to 0, the&amp;lt;br&amp;gt;distance between plasma particles will be proportional to the size of the&amp;lt;br&amp;gt;first particle. (default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the weapons TDF tag &#039;visibleShieldHitFrames&#039; (defaults to 0 frames)&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; can be used along with  &#039;visibleShieldHit&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
:*&amp;lt;span&amp;gt; the alpha value fades after the hit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added colormap for ballistic (&#039;cannon&#039; type) weapons.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean weapon TDF tag AvoidFeature, this makes the weapon avoid&amp;lt;br&amp;gt;features while targetting. (default: 1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag FallOffRate: rate at which the beamweapon fades out&amp;lt;br&amp;gt;after it goes past its maximum range. 0 is never fade out, 1 is finish fading&amp;lt;br&amp;gt;out exactly at max range, the default 0.5 is the previous behaviour.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag LodDistance: minimum camera distance at which the&amp;lt;br&amp;gt;default beamweapon projectile is simplified to rectangle. (default: 1000)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag DynDamageExp: exponent of the damage formula, 0&amp;lt;br&amp;gt;(the default) disables dynamic damage. 1 means linear scaling.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag DynDamageMin: minimum damage value. (default: 0)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added boolean weapon TDF tag DynDamageInverted: inverts the damage curve.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added float weapon TDF tag DynDamageRange: if set it will use this value&amp;lt;br&amp;gt;instead of the range value from the weapon in the calculation.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==New projectile handler textures==&lt;br /&gt;
*&amp;lt;span&amp;gt; sbtrailtexture         - default first section of starburst missile trail texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; missiletrailtexture    - default first section of missile trail texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; muzzleflametexture     - default muzzle flame texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; repulsetexture         - texture of impact on repulsor&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; dguntexture            - dgun texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; flareprojectiletexture - texture used by flares that trick missiles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; sbflaretexture         - default first section of starburst missile trail texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; missileflaretexture    - default first section of missile trail texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; beamlaserflaretexture  - default beam laser flare texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; bubbletexture          - torpedo trail texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; gfxtexture             - nanospray texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; projectiletexture      - appears to be unused&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; repulsegfxtexture      - used by repulsor&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; sphereparttexture      - sphere explosion texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; wrecktexture           - smoking explosion part texture&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; plasmatexture          - default plasma texture&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scons build system==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added debugdefines configure option: true by default, if it&#039;s set to false&amp;lt;br&amp;gt;(debugdefines=no) then a debug build will be made with release preprocessor&amp;lt;br&amp;gt;defines. This can be used to generate debugging symbols for release builds.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added dc_allowed configure option to enable/disable direct control.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unitsync==&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetSpringVersion() function to unitsync. This returns the Spring version.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Deprecated InitArchiveScanner() unitsync function.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added java bindings to unitsync.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unitsync is now installed to libdir on Linux. It can be assumed this is&amp;lt;br&amp;gt;either /usr/local/lib/spring/unitsync.so or /usr/lib/spring/unitsync.so.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.74b3=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added LuaUI v0.1  (with widget management code, somewhat experimental)&amp;lt;br&amp;gt;(requires the LuaUI setting to be on to be autoloaded,&amp;lt;br&amp;gt;&amp;quot;/luaui disable&amp;quot;      to disable in-game&amp;lt;br&amp;gt;&amp;quot;/luaui reload&amp;quot;       to load in-game&amp;lt;br&amp;gt;&amp;quot;/luaui reload fresh&amp;quot; to load in-game, but with fresh state)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed docs/lua_ui_interface.txt to LuaUI/API.txt&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/minimap slavemode [0|1]&amp;quot; and &amp;quot;/minimap draw&amp;quot; for use with LuaUI&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/specfullview 2&amp;quot; spectator mode, where you can both view and select all units&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/volume &amp;lt;fraction&amp;gt;&amp;quot; command  (0.0 to 1.0 range)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;group &amp;lt;int&amp;gt; [ &amp;quot;set&amp;quot; | &amp;quot;add&amp;quot; | &amp;quot;selectadd&amp;quot; | &amp;quot;selectclear&amp;quot; | &amp;quot;selecttoggle&amp;quot; ]&amp;quot;&amp;lt;br&amp;gt;action as an alternative to the group[0|9] commands  (note that the key modifiers can&amp;lt;br&amp;gt;be setup differently from the default)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed FBI tag floater for planes,&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added FBI tag canSubmerge for planes. The following rules apply:&amp;lt;br&amp;gt;1) If a plane only has the &#039;floater&#039; tag set to 1, it will land on the ocean surface.&amp;lt;br&amp;gt;2) If a plane only has the &#039;canSubmerge&#039; tag set to 1, it will land on the ocean floor.&amp;lt;br&amp;gt;3) If a plane has both tags set to 1, it will obey rule 2.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the factory cancelled-build delay bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed units get stuck while guarding factories bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed planes can&#039;t find landing pad on large maps bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed in game video creation (default binding F10).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a bug causing much metal/energy to be lost instead of shared to allies.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Smoothed LOS / Radar view.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.74b2=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Planes can land on water surface if FBI tag floater is set to true.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GROUND_WATER_HEIGHT (78) to get in cob script.&amp;lt;br&amp;gt;Same as GROUND_HEIGHT (16) but in water it returns negative water depth instead of 0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Units don&#039;t slowdown on intermediate waypoints anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added mingw compatible crashhandler.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed sharebox and quitbox for 16 players.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed FPS mode aiming to the northwest.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed FPU control word assertion that made spring unplayable with some sound drivers.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added sorting options to &amp;quot;/info&amp;quot;, you can use names or numbers:&amp;lt;br&amp;gt;0 - &amp;quot;off&amp;quot;,   disable display&amp;lt;br&amp;gt;1 - &amp;quot;ally&amp;quot;,  allies  (you, your team, your allyteam, your enemies, then spectators)&amp;lt;br&amp;gt;2 - &amp;quot;team&amp;quot;,  player team id&amp;lt;br&amp;gt;3 - &amp;quot;name&amp;quot;,  player name alphabetic sort&amp;lt;br&amp;gt;4 - &amp;quot;cpu&amp;quot;,   player cpu usage&amp;lt;br&amp;gt;5 - &amp;quot;ping&amp;quot;,  player ping time&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;maxparticles &amp;lt;value&amp;gt;&amp;quot;       action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;minimap simplecolors [0|1]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the &amp;quot;specfullview [0|1]&amp;quot;         action&amp;lt;br&amp;gt;(setting it to 0 gives the same minimap and viewport visibility as the selected team)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;OverheadTiltSpeed&amp;quot; config parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the unit-limit vs. sharing bug&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Shadow mapping works for SM3&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.74b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Linux vs Windows is now synced if binaries are built using gcc 4.0 or higher.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Games with more then 10 players now work properly.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Several improvements and fixes for autohosting, including a .kickbynum command.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added minimap commands (two modes, see the MiniMapFullProxy config param)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;MiniMapGeometry&amp;quot; config parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;TooltipGeometry&amp;quot; config parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;TooltipOutlineFont&amp;quot; config parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;InfoConsoleGeometry&amp;quot; config parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/resbar [0|1]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/tooltip [0|1]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;/specteam &amp;lt;number&amp;gt;&amp;quot; action  (sets the spectator team)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;newAttackMode&amp;quot; and friends to &amp;quot;ctrlpanel.txt&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added animated line stippling for queue rendering  (see cmdcolors.txt)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Cursors can now use TGA and PNG file formats&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added an optional cursor control file for easier timing/frame control&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed the /layout command to /luaui&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Renamed the &amp;quot;ctrlpanel.lua&amp;quot; file to &amp;quot;gui.lua&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;timewait [seconds] [&amp;quot;queued&amp;quot;]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;deathwait [&amp;quot;queued&amp;quot;]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;squadwait [count] [&amp;quot;queued&amp;quot;]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;gatherwait&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;gathermode [0|1]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a number of features to the LuaUI&amp;lt;br&amp;gt;(see Documentation/lua_ui_interface.txt)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved the outline font rendering speed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; numbers in .info list are now team numbers, so they match with &#039;.team X&#039; commands.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; names are now prefixed with &#039;s:&#039; &#039;a:&#039; or &#039;e:&#039; for respectively spectators, allies and enemies.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; if spectating, an arrow is displayed in front of the team you are currently watching.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added Shift and Alt/Meta group selection modifier features&amp;lt;br&amp;gt;(Shift adds members to current selection, Alt/Meta toggles them)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added the  &amp;quot;viewsave &amp;lt;name&amp;gt;&amp;quot;  and  &amp;quot;viewload &amp;lt;name&amp;gt;&amp;quot;  actions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added GetCameraState() and SetCameraState() to the lua GUI interface&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;selectcycle [restore]&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed queue build rendering (GL_DEPTH_TEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added GetUnitHealth(), GetTeamResources(), and GetCommandQueue() to the lua GUI interface&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; enabled loading the &amp;quot;ctrlpanel.lua&amp;quot; file from the VFS&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;wait queued&amp;quot; and &amp;quot;selfd queued&amp;quot; to the default key bindings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed WAIT behaviour for factories&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; enabled queuing of Self Destruction commands&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a pathetic SELFD cursor&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;alwaysDrawQueue&amp;quot; and &amp;quot;buildBoxesOnShift&amp;quot; to cmdcolors.txt&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added the &amp;quot;invqueuekey [0|1]&amp;quot; action, and [InvertQueueKey=0] config parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added mouse rocker gestures for immediate mode access when using inverted queue keying&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; AIs can query a unit current fuelstorage via GetProperty() with property AIVAL_CURRENT_FUEL (2).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; AIs receive seismic pings via HandleEvent() function with message AI_EVENT_SEISMIC_PING (5).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; The icontype of enemy units is remembered if they are under continuous radar coverage.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Ghosted buildings under continuous radar coverage don&#039;t have an error vector in their position anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Ghosted buildings also turn into unit icons when far away.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved clickability of unit icons.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Calling emit-sfx 2048 from a script will now allways fire the weapon. Emit-sfx 4096 will now take over the previous behavior of detonating the weapon at the piece position.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added unit FBI tag UnitRestricted to limit the number of a unit type allowed in a game.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added CLOAKED (76) and WANT_CLOAK (77) to get/set in cob script.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.73b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added the ability to layout the control panel widget layout with a LUA script&amp;lt;br&amp;gt;(uses a file called &amp;quot;ctrlpanel.lua&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added the &amp;quot;/layout&amp;quot; command for direct interaction with the layout lua script&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Map packs (ie. multiple maps in one archive) are officially unsupported now because of technical reasons.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added keyword &amp;quot;dir&amp;quot; to explosiongenerator, this is a vector and can be diferent depending on what created the explosion.&amp;lt;br&amp;gt;If created at a weapon impac it is the direction of the impact.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the abillity to call explosiongenerators and weaponfire from within script via emit-sfx command.&amp;lt;br&amp;gt;Explosiongenerators to be called via script are defined in the unit TDF file in a section called SFXTypes, with tags explosiongenerator+n=some_explosion&amp;lt;br&amp;gt;and then called via emit-sfx 1024+n.&amp;lt;br&amp;gt;Weaponfire are called via emit-sfx 2048+weapon_to_fire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;ctrlpanel.txt&amp;quot; configuration file to control how the Control Panel&amp;lt;br&amp;gt;is rendered (x/y icons counts, sizes, positions, prev/next menu icon&amp;lt;br&amp;gt;locations, etc...)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added an option in &amp;quot;ctrlpanel.txt&amp;quot; to render some of the screen text with&amp;lt;br&amp;gt;an outlined font. This is a hack, and can cause FPS decreases on slower&amp;lt;br&amp;gt;computers (main factor is blended fill-rate)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added an outline around the minimap&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed reclaim exploit where extra metal was gained if you destroyed the building just before it would finish reclaiming.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;cmdcolors.txt&amp;quot; settings file to configure control indicator rendering&amp;lt;br&amp;gt;(this includes command queue lines and ranges, highlighted unit ranges, the&amp;lt;br&amp;gt;mouse selection box, and the selected unit boxes)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added line width specification for items in &amp;quot;cmdcolors.txt&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added blending mode specification for items in &amp;quot;cmdcolors.txt&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; removed &amp;quot;NoSound&amp;quot; config parameter in favour of &amp;quot;MaxSounds=0&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; passthru to the NullSound driver if there is a sound driver error&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added a page number to the control panel&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;buildiconsfirst&amp;quot; command to toggle the order of control panel icons&amp;lt;br&amp;gt;(also set the control panel page number to the cmdcolors.txt build color&amp;lt;br&amp;gt;when the build icons are being placed first)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added build range circles for immobile builders when holding shift over them&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added the techLevel variable to UserDef, with automatic detection of the&amp;lt;br&amp;gt;tech levels in a mod based on the information in the sidedata.tdf file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added the &amp;quot;techlevels&amp;quot; action, to save the tech levels to techlevels.txt&amp;lt;br&amp;gt;(as well as sending them to stdout)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; display a unit&#039;s TechLevel in the tooltip window when cheats are enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; key commands now work while the GUI interface is hidden, and the default&amp;lt;br&amp;gt;command cursor icon is updated as well&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; change the control panel page when a key command accesses an off-page icon&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; change the tooltip to reflect the unit being built rather then the builder&amp;lt;br&amp;gt;while selecting the build position&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added cycling for command actions when more then one is available&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;iconpos &amp;lt;#&amp;gt;&amp;quot; action, for positional access to control panel icons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;firstmenu&amp;quot; action  (resets the control panel to its first page)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;keyset&amp;quot; command for named keysets&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;keysym&amp;quot; command for custom key symbols&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;fakemeta&amp;quot; key binding command to provide another modifier&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added SmoothLines and SmoothPoints config parameters  (anti-aliasing)&amp;lt;br&amp;gt;(0 = off,  1 = fastest,  2 = don&#039;t care,  3 = nicest)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; changed GameInfo so that it always displays map name and mod name&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; group AI code now permits multiple AIs per dll/so. This is handled by&amp;lt;br&amp;gt;identifying group AIs by a new datatype, &#039;AIKey&#039;, rather than using just&amp;lt;br&amp;gt;the dll name. Group AI dlls should now implement GetAiNameList to return an&amp;lt;br&amp;gt;array of available AI names in string (const char*) form, terminated by NULL.&amp;lt;br&amp;gt;The existing group AI interface functions GetNewAi, ReleaseAi, and&amp;lt;br&amp;gt;IsUnitSuited now take an unsigned aiNumber as their first parameter: this&amp;lt;br&amp;gt;is a zero-based AI index, matching the array returned by GetAiNameList.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; improved default command selection&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;/water   [0-3]&amp;quot; to control water rendering in-game&amp;lt;br&amp;gt;(the optional number is the mode; without the number, it cycles through the modes)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;/shadows [0-1]&amp;quot; to control shadow rendering in-game&amp;lt;br&amp;gt;(the optional number means off/on; without the number, it toggles)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fix mouse-drag-move to make units spread across the front if it&#039;s big enough, also somewhat take into account unit sizes. Added CTRL-Move, CTRL-Mouse-Drag(front) move to make units move at the speed of slowest unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [bugfix] Resource expendature now shows correct pull when economy is stalling.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; - Added transparency suport from texture2 in s3o drawing, requires advanced shading.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added DualScreenMode and DualScreenMiniMapOnLeft configuration flags.&amp;lt;br&amp;gt;This causes the game view width to be one half of the screen width, so the minimap can take the other half.&amp;lt;br&amp;gt;You will need to spread your spring window across the 2 screens.&amp;lt;br&amp;gt;Specifying DualScreenMiniMapOnLeft will place the minimap on the left hand screen, rather than the right (the default)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; geothermal vents with a geothermal unit on top will not create smoke.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added the following Unit FBI tags:&amp;lt;br&amp;gt;canPatrol=1; Can the unit go on patrol&amp;lt;br&amp;gt;canGuard=1; Can the unit guard things&amp;lt;br&amp;gt;canAttack=1; Can the unit attack other units&amp;lt;br&amp;gt;Reclaimable=1; Determines if a unit can be reclaimed by other units&amp;lt;br&amp;gt;noAutoFire=0; (if set to 1, unit will fire once then switch to next target, and needs to be told to fire manually)&amp;lt;br&amp;gt;canBuild (can the unit start new construction projects)&amp;lt;br&amp;gt;canRepair (can the unit repair other things)&amp;lt;br&amp;gt;canRestore (can the unit restore deformed ground)&amp;lt;br&amp;gt;canReclaim (can the unit reclaim other things)&amp;lt;br&amp;gt;canAssist (can the unit assist construction projects already started)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added support for teamcolored nanospray (user option). Can be forced off by modder using gamedata/particles.tdf.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new fbi tag shownanoframe: set to 0 to disable nanoframe while the unit is being built.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new fbi tag shownanospray: set to 0 to disable nanospray.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; new fbi tag nanocolor: color of the nanospray and the nanoframe in red green blue format (white = 1 1 1).&amp;lt;br&amp;gt;(These three fbi tags apply to the unit itself; not to the unit it&#039;s building.)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; linux vs linux is now synced, independently of the distribution &amp;amp; gcc version&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; if host finishes loading before client executable is started spring no longer loses connection&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added the &amp;quot;say&amp;quot; action  (does work with the .give command)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; changed .clock and .info to local commands (/clock and /info now work as well)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; replaced key binding code with a more flexible solution:&amp;lt;br&amp;gt;* can specify key for almost all commands (including unit builds)&amp;lt;br&amp;gt;* can specify modifiers (Alt, Ctrl, Meta, Shift)&amp;lt;br&amp;gt;* can bind the same key to more then one action&amp;lt;br&amp;gt;(first available action is used, handy for build orders)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added internal default bindings  (see rts/Game/UI/KeyBindings.cpp)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;unbindall&amp;quot;                command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;unbindKeyset    &amp;lt;keyset&amp;gt;&amp;quot; command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;unbindAction    &amp;lt;action&amp;gt;&amp;quot; command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;unbind &amp;lt;keyset&amp;gt; &amp;lt;action&amp;gt;&amp;quot; command&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;bindbuildtype ...&amp;quot;        command  (aka: auto-binder)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;hotbind&amp;quot;   action for the control panel icons  (Ctrl+insert)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;hotunbind&amp;quot; action for the control panel icons  (Ctrl+delete)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added /keysave and /keyload commands&amp;lt;br&amp;gt;(keysave saves to &amp;quot;uikeys.tmp&amp;quot;, not &amp;quot;uikeys.txt&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added /keyprint, /keydebug, /keysyms, and /keycodes commands&amp;lt;br&amp;gt;(these commands send information to stdout)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added ability to specify item in icon mode buttons via its binding&amp;lt;br&amp;gt;(ex:  &amp;quot;firestate 0&amp;quot; binding will set firestate to hold fire)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added ability to specify item in combo box buttons via its binding&amp;lt;br&amp;gt;(ex:  &amp;quot;aiselect Radar AI&amp;quot; binding will assign the selected units to the Radar AI)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; pseudo mouse actions now discard key repeats&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added command queue icons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added build command queue directional lines&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added AreaAttack command queue area display&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added game info panel (with &amp;quot;gameinfo&amp;quot; and &amp;quot;gameinfoclose&amp;quot; actions)  (i)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; versionned the &amp;quot;archivecache.txt&amp;quot; filename (ex: &amp;quot;ArchiveCacheV4.txt&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Quit and Share menus close when they receive ESC&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;drawlabel&amp;quot; action  (avoid the double-click, and key repeats)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;screenshot png&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;chatAll&amp;quot;        action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;chatSwitchAll&amp;quot;  action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;chatAlly&amp;quot;       action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;chatSwitchAlly&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;chatSpec&amp;quot;       action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;chatSwitchSpec&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added tracked unit rotation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added Average and Extents tracking modes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;trackoff&amp;quot;  action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;trackmode&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;viewfps&amp;quot; action     (Ctrl+f1)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;viewta&amp;quot;  action     (Ctrl+f2)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;viewtw&amp;quot;  action     (Ctrl+f3)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;viewrot&amp;quot; action     (Ctrl+f4)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;firestate&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;movestate&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;prevmenu&amp;quot;  action   (,)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;nextmenu&amp;quot;  action   (.)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;buildunit_&amp;lt;name&amp;gt;&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;deselect&amp;quot; action&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added &amp;quot;select &amp;lt;selection criteria&amp;gt;&amp;quot; action  (redundant)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; added new water rendering mode, refracting+reflecting but without the heavy dynamic simulation.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;--quit=T&#039;, &#039;/quit T&#039; commandline option to auto-quit spring on game over or after T seconds.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &#039;--minimise&#039;, &#039;/minimise&#039; commandline option to start spring minimised.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added gradual feature reclaiming, see mantis #262&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; support for rotating buildings by 90 degrees, bind to &amp;quot;incbuildfacing&amp;quot; and &amp;quot;decbuildfacing&amp;quot; (bound to &#039;]&#039; and &#039;[&#039; by default)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; modified the ground attack command for queued attack and area attack patterns&amp;lt;br&amp;gt;(the last queued attack position is repeated for backwards compatibility)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; removed the height factor from AirCAI ground attack command drawing&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added word completion, with dot commands, player names, and unit names&amp;lt;br&amp;gt;(does partial match reporting, and the unit names are only active for .give commands)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;&amp;gt; &amp;quot;/&amp;lt;tab&amp;gt;&amp;quot; will show local commands&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;&amp;gt; &amp;quot;.&amp;lt;tab&amp;gt;&amp;quot; will show remote commands&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added console input history buffer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added [DoubleClickTime=200] config parameter&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added [WindowEdgeMove=1], for folks who run windowed with fullscreen size&amp;lt;br&amp;gt;(ex: good with X11/icewm to allow moving between virtual screens,&amp;lt;br&amp;gt;and to avoid display lockups during crashes)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; disabled rendering while inactive (minimized)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added a null sound driver [NoSound=1]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; merged global synced/unsynced &amp;quot;drawdebug&amp;quot; variables&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added vsync for GLX&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; windows users can use [VSync=-1] to use system default&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; allow selection of vsync rate&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; [feature] A new group AI, &amp;quot;MexUpgrader AI&amp;quot; has been added. See http://springrts.com/wiki/MexUpgrader_AI for more info.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [feature] Custom unit icons are supported. See http://springrts.com/wiki/CustomUnitIcons for more info.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [bugfix] &#039;Quit and Resign&#039; dialog now also appears when you&#039;re hosting, and stays hidden when the game is over.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [bugfix] Commands on enemy units (attack, reclaim) get canceled automatically when the unit leaves LOS / radar.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [change] &#039;Quit and Resign&#039; dialog now only gives everything to allies (and not enemies) if they are still alive.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [change] The LOS drawing mode is remembered when you switch back and forth to others (e.g. metalmap, heightmap).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [change] Radar and jammer range is shown by default if you press &#039;L&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; [change] Radar and jammer toggle &#039;;&#039; happens instantly.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag ColorMap, used for some weapon to define the color shift during their lifetime&amp;lt;br&amp;gt;Used in flamethrower.&amp;lt;br&amp;gt;Tag specify either a bitmap file, ex: &amp;quot;colormap = mycolormap.tga;&amp;quot;&amp;lt;br&amp;gt;or defines the color directly in the weapon file in rgba order where 1 is full brightnes,&amp;lt;br&amp;gt;ex: &amp;quot;colormap=1 0 0 1 0 0 0 1&amp;quot; start with red color and shift to black at the end.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag rgbcolor2, used to make laser weapon have different color at the center, defaults to white.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag corethickness, how thick the inner color of a laser is, this is a percentage value, default is 0.25&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag laserflaresize, size of the flare for laser weapons, multiplier for thickness, default 15.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag LargeBeamLaser, if set to 1 a beamlaser uses an alternate graphics effect.&amp;lt;br&amp;gt;New tags usable for a LargeBeamLaser is:&amp;lt;br&amp;gt;tilelength: defines the length before the texture used is repeated (tiled).&amp;lt;br&amp;gt;scrollspeed: how fast the beam apears to be moving towards it target.&amp;lt;br&amp;gt;pulseSpeed: how fast the pulsating effect at the beam start is.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Texture tag added to the explosiongenerator for HeatCloud and Dirt&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon FBI tags, texture1, texture2, texture3, texture4, the texture must be defined in resources.tdf in the projectile section.&amp;lt;br&amp;gt;MissileProjectile (standar rockets and guided missiles):&amp;lt;br&amp;gt;texture1 = flare&amp;lt;br&amp;gt;texture2 = smoke&amp;lt;br&amp;gt;LaserProjectile:&amp;lt;br&amp;gt;texture1 = laserbeam&amp;lt;br&amp;gt;texture2 = Start and end of the beam (half of the texture used at either end.)&amp;lt;br&amp;gt;BeamLaserProjectile:&amp;lt;br&amp;gt;texture1 = laserbeam&amp;lt;br&amp;gt;texture2 = Start and end of the beam (half of the texture used at either end.)&amp;lt;br&amp;gt;texture3 = muzzle flare&amp;lt;br&amp;gt;LargeBeamLaserProjectile:&amp;lt;br&amp;gt;texture1 = laserbeam&amp;lt;br&amp;gt;texture2 = Start and end of the beam (half of the texture used at either end.)&amp;lt;br&amp;gt;texture3 = Extra graphical effect at the start of the beam.&amp;lt;br&amp;gt;texture4 = muzzle flare&amp;lt;br&amp;gt;StarBurstProjectile (starburst weaponry, like nukes):&amp;lt;br&amp;gt;texture1 = flare&amp;lt;br&amp;gt;texture2 = smoke&amp;lt;br&amp;gt;texture3 = flame&amp;lt;br&amp;gt;EmgProjectile&amp;lt;br&amp;gt;texture1 = texture for the projectile&amp;lt;br&amp;gt;LightningProjectile&amp;lt;br&amp;gt;texture1 = texture for the lightning&amp;lt;br&amp;gt;ExplosiveProjectile (used in most plasma cannons)&amp;lt;br&amp;gt;texture1 = texture of the projectile, will be blended multiple times.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; tdf tag duration is used for laser weapons.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; tdf tag rgbcolor is used for EmgProjectile and ExplosiveProjectile.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; tdf tag intensity is used for EmgProjectile and ExplosiveProjectile.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag soundstartvolume and soundhitvolume.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag size, defines the visible size of projectiles.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag CollisionSize, defines the physical size of projectiles, percentage of size for flamethrower and absolute value emg, plasma and laser.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag sizegrowth, defines how fast flame projectiles will grow in size.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag flamegfxtime, this makes the flame projectile stay alive as a graphical effect (doesnt do any damage) after it has reached maxrange.&amp;lt;br&amp;gt;Default is 1.2 which makes it stay alive 20% beyond maxrange.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag AvoidFriendly, if set to 0 units will not try to avoid friendly units in their line of fire.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag CollideFriendly, if set to 0 this weapon will not hit friendly units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tdf tag ExplosionSpeed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; edgeEffectivness added for weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added limited fuel settings for units (only work for aircrafts so far, need a good mechanism for refueling other stuff)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag MaxFuel, max fuel in seconds that the unit can carry, default 0 = unlimited&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag RefuelTime, how long time it takes to fully refuel the unit, default 5&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag MinAirBasePower, minimum build power an airbase unit must have for the aircraft to land on it, default 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag WeaponFuelUsage&amp;lt;1-16&amp;gt;, how much fuel in seconds that firing the weapon takes from the owning unit, default 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag SeismicDistance, give the unit a seismic sensor for detecting movement through the ground.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag SeismicSignature, The magnitude of seismic disturbance when this unit is moving, default sqrt(mass/100).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New COB &amp;quot;get&amp;quot;/&amp;quot;set&amp;quot; constant: 75 MAX_SPEED get/sets the max speed of the unit (multiplied with 64k)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; New archive format (for map/mod development): *.sdd. It is a directory, but it is treated as an archive just like *.sdz and *.sd7.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New map format SM3, currently supported for testing purposes.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.72b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Bos/Cob script for units can now animate the death of the unit. Just have the Kill function return after a while instead of directly and return wreck level in return value instead of in function argument.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed the com dies, game ends exploit: sharing your com now kills you&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed a bug causing clients not to quit when server quits&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed crash bug normally resulting in dialog with &amp;quot;no rtti data&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; &amp;quot;.give&amp;quot; cheat command doesn&#039;t desync the game anymore&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Made &amp;quot;Team0() is no more&amp;quot; message customizable by modders (see XTA for an example).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added weapontag &amp;quot;paralyzetime&amp;quot;, controls how long a unit can maximaly be paralyzed after being hit by this weapon, default 10&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Adds some new options in the settings program for scroll speeds&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new fbi tag &amp;quot;levelground&amp;quot; set this to 0 to prevent a building from leveling ground beneth it. Make sure that the model continue some way below ground so that they dont look like they float in air.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed torpedo aircrafts not being able to attack subs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added support for decals on ground below buildings&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag UseBuildingGroundDecal, set to 1 to enable decals for building&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag BuildingGroundDecalType, name of a bitmap in unittextures folder&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag BuildingGroundDecalSizeX,BuildingGroundDecalSizeY, size of decal (same scale as footprint for unit)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New fbi tag BuildingGroundDecalDecaySpeed, how fast the decal will fade out after the building has died, default 0.1 (fades out in 10s)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New fbi tag ShowPlayerName, if set to 1 the tooltip shows the player name instead of the unit description&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fbi tag HideDamage now actually works: set it to 1 to hide most details in the unit&#039;s tooltip from enemies&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; New weapon tag &amp;quot;rgbcolor&amp;quot;, overrides the old color1 and color2 tags if it exists, gives the color in red green blue format (1 1 1 = white).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removed old plasmarepulser system and replaced it with a more generalized shield system&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag IsShield, if 1 mean the weapon is a shield and now a weapon&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldrepulser, 0=destroy projectile,1=repulse (bounce) projectile&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag smartshield, 1=shield doesnt affect allies weapons&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag exteriorshield, 1=shield doesnt affect weapons fired from within shield&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag visibleshield, 1=see a visible shell representing the shield&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag visibleshieldrepulse, 1=see a beam showing when shield repulses something&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldenergyuse, how much energy the shield use when repulsing/destroying something&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldforce, how hard shield can accelerate some sort of projectiles away&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldradius, size of shield effect&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldmaxspeed, maximum speed the shield can push some sort of projectiles away&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldpower, how much power the shield can store, power is drained by the affected weapons damage, 0=infinite&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldpowerregen, how fast the shield regenerates power&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldpowerregenenergy, how much energy the shield uses when regenerating power&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldintercepttype, which types of weapon the shield can affect (bitfield)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag interceptedbyshieldtype, which types of shields can affect this weapon, if (shieldInterceptType &amp;amp; interceptedByShieldType) is not zero the shield can affect the weapon, default 1 for plasma, 2 for laser, 4 for missiles, 0 for other&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldgoodcolor, color of shield when power is full&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldbadcolor, color of shield when power is empty&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;  New weapon tdf tag shieldalpha, how visible the shield shell is with visibleshield=1&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added auto zooming using scroll + Left ALT key  (patch from colorblind)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added simplified LOS drawing (patch from colorblind)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed mouse speed problems in windows with holding shift.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Demo filenames with spaces in them work again.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed non-positional sound behavior: only selected units give non-positional sound&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Missile weapons no longer tracks to exact position of non flying units (make missile units weaker against radar targets)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Stun damage units now receives 1/10 of normal experience and no experience for attacking already stunned units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units no longer receive experience for &amp;quot;overkill&amp;quot; damage&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Adds support for using arbitary team colors, teamcolor textures for 3do need to be slightly changed to accomendate this (see the base texture archive to see how its done)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Increased max camera zoom out (zooming to far can cause slowdowns/graphical glitches)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added Radar group AI from colorblind: It notifies the player of incoming enemy units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added custom explosion generator: It can be enabled using &amp;quot;explosiongenerator=custom:SomeExplosionGeneratorName&amp;quot; in the weapon TDF. See the wiki page http://springrts.com/wiki/CustomExplosionGenerators for more info.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Tab will now bring zoom out to show all map in any camera mode, tab again zooms back to the mouse cursor.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added GetGravity(), GetUnitDefHeight() and GetUnitDefRadius() to AI interface&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Mod can now be selected in the single player menu.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Checksums of the map and mod are checked on game start.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Mod can be selected when starting the spring exe directly.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Various other small changes.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.71b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new water renderer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed lasers firing two projectiles at once, efficiently doing double damage.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed several exploits with FPS mode.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added new fbi variable CanLoopbackAttack, only affects fighter aircrafts, if 1 this will enable the player to set the aircraft to do an immelman turn after firing instead of overflying the target.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Changed so units in maneuver mode will abort anything that moves them further than a certain distance from the patrol path&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added statistics to the end game dialog&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Units with S3O models can explode into pieces.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added a &amp;quot; all&amp;quot; option to .give to give all units in loaded mod&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed autoheal being about 4x to fast (or measuring heal per 0.25s depending on how one sees it)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Improved exception handling and crashreport handling in windows.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added DateTime to the [VERSION] block in the demo recorder file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Removes los from units being transported&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; To disable terrain deformation:&amp;lt;br&amp;gt;Mapmakers: Put &#039;NotDeformable=1&#039; in the .smd.&amp;lt;br&amp;gt;script.txt: Put &#039;DisableMapDamage=1&#039; in with the other properties.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; VSync can be disabled with the settings application.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Several other smaller fixes and improvements.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Unit reply sounds are non-positional and have a seperate volume setting in the config application. Their volume is also affected by the global volume.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.70b3=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Shift/ctrl do not change rotation speed in rotating camera mode anymore.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Submarines work again.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed attack claxxon.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed units getting stuck in buildings.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added possibility to bind mouse1, mouse2 and mouse3 to keyboard.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed shift+letter bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed Pathing Map (F2 view) bug.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.70b2=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed some (debug) message colors.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed keyboard layout problems.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed repeat orders/high trajectory etc not indicating their current state correctly&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed problem with reading hpi archives&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added custom SDL.dll (1.2.9) with refresh rate patch from SDL CVS, should help with the 60hz issue&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed right shift/ctrl while scrolling.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed shift/ctrl while middle click drag scrolling.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed map loading by less strict tdf parser.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Don&#039;t crash on parse errors, but show an error message instead.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.70b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; First use of crossplatform code! This required a lot of bugfixing and changes, which are not mentioned here.&amp;lt;br&amp;gt;Among these changes are switches to using boost, SDL, freetype, instead of Win32 SDK + DirectX. For a full list of changes, see the subversion log.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; XTA Pimped Edition Version 3, a version of XTA with high detail models, is used as the default mod now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Binding for mouse button 4/5 added (defaults to Z and X), so you can set build spacing.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; You can enable advanced unit rendering without enabling shadow mapping (in the settings app).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Various resource files are now read from gamedata/resources.tdf instead of hardcoded into the game exe.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Added &amp;quot;dontland&amp;quot; unit tag, to specify aircraft that should not land. Don&#039;t use this on transport units!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; std::sort related bug fixed in projectile handler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed flipped features, they are now rendered exactly the same as units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; A few new COB &amp;quot;get&amp;quot; constants:&amp;lt;br&amp;gt;70 MAX_ID             returns maximum number of units - 1&amp;lt;br&amp;gt;71 MY_ID              returns ID of current unit&amp;lt;br&amp;gt;72 UNIT_TEAM	         returns team of unit given with parameter&amp;lt;br&amp;gt;73 UNIT_BUILD_PERCENT_LEFT   basically BUILD_PERCENT_LEFT, but comes with a unit parameter&amp;lt;br&amp;gt;74 UNIT_ALLIED        is unit given with parameter allied to the unit of the current COB script. 1=allied, 0=not allied&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed login packets being sent every frame instead of once a second when trying to connect&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed ghosted buildings option.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; Fixed isairbase=1 unit tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.67b3=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;AI dll&#039;s can be used with startscripts again&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.67b2=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed black map bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Impulsefactor now affects ground damage&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;- Lobby changes&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt; battle hosts can now use /ring &amp;lt;username&amp;gt; command on players participating in their battles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed problem with notification dialog switching focus back to application&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added /rename command which will rename your account (so that people who wish to add clan tags&amp;lt;br&amp;gt;in front of their names don&#039;t have to reregister and lose their ranks). Player names may now also&amp;lt;br&amp;gt;contain &amp;quot;[&amp;quot; and &amp;quot;]&amp;quot; characters.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; fixed small bug in demo script parser&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; added /mute, /unmute and /mutelist commands for admins/mods&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt; clients behind same NAT now get local IPs instead of external one (from the server).&amp;lt;br&amp;gt;Note that some issues still exist with currently implemented nat traversal method,&amp;lt;br&amp;gt;so players hosting battles are advised to forward their port nonetheless.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.67b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Catching AI exceptions can be disabled with the settings app.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed access-violation bug when creating sky.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed numerous division by zero bugs.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed default cursor for indestructible features.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Beamlaser uses thickness value.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;COB support for Getting/Setting veteran level and unit speed.&amp;lt;br&amp;gt;The returned veteran level is unit experience multiplied by 100&amp;lt;br&amp;gt;Unit speed can be set to something nonzero only when the current speed is nonzero, it can always be set to zero.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Overhead camera can be tilted with control key + mousewheel now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Debug message verbose level can now be set with the settings application. (Modified update by Alantai)&amp;lt;br&amp;gt;This will only affect AI console messages.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Ghosted buildings can now be disabled by the lobby. They are enabled by default.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.66b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed transport units being able to load themself.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed gunship like aircraft always having the same altitude&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed torpedo aircrafts now being able to attack underwater targets&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Support for upright, flammable and indestructible feature tags&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed division-by-zero bug in bomb-dropper.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed access-violation bug in pathfinder.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new s3o unit format&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new tags to .fbi file&amp;lt;br&amp;gt;autoHeal	-	health per second that a unit allways will be autohealed for (default 0)&amp;lt;br&amp;gt;idleAutoHeal	-	health per second that a unit will be autohealed for whenever its idling (default 10)&amp;lt;br&amp;gt;idleTime	-	time in ticks without any action before a unit is considered idling (default 600)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new tags to weaponfile file&amp;lt;br&amp;gt;NoSelfDamage	-	Units take no splash damage from its own weapon&amp;lt;br&amp;gt;impulsefactor	- 	Explosion impulse will be multiplied by this&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added read access to the virtual filesystem for the AI&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Further AI interface updates will now be backwards compatible (old AI&#039;s will not break on a new spring release)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added user input functions from Alik to the AI interface&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;The global AI will now be notified if a unit changes team.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;UnitDestroyed/EnemyDestroyed get the attacker unit id if any (by submarine)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=0.65b2=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash with factories closing at the moment they die&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed sync error on water maps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Increased max players/teams to 32/16&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for selecting which globalai-dll to use when starting spring.exe directly&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for having more than one lua startscript. Put them in subfolder &amp;quot;startscripts&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added UnitMoveFailed to global AI interface. Called when ground units fail to move to their destination.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.65b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash bug involving radars on non square maps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash bug involving gunships landing on repairpads that get destroyed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash bug involving large units exploding&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed resurrected building not having a footprint&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Increased time to reclaim wreckages&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed acceleration for units not being correctly set from fbi file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed slope of map not getting updated properly for craters&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed sonar jamming&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Can now switch viewed team when spectating using keys 1-9&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added faster reload speed for experienced units&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for multiplayer replays where several players can watch a reply at once&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added option for minimap to show colors only based on owned(green),ally(blue),enemy(red)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new FBI tag TransportMass, this is the maximum weight a tranporter can transport, default 100000&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new FBI tag Mass, this is the weight of the unit, default is metalcost of unit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new FBI tags to set the control variables for aircrafts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new FBI tag OnlyTargetCategory&amp;lt;weaponnum&amp;gt;, sort of like badtargetcategory but the weapon can only target units with these categories,toairweapon in weaponfile is the same as OnlyTargetCategory=VTOL; default is all categories&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added bindings for creating startscripts in lua. See testscript.lua for an example. Note that you can only have one script (must be called testscript.lua), and that it is possible that the interface will change.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed bugs in the AI interface GetMetal* and GetEnergy* functions, they returned the values of the human player.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Moved shared functions in the GroupAI callback and GlobalAI callback to a new AICallback interface. For AI developers: This means a small adjustment of your current code will be required to get it compiled again.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.64b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Solved troublesome crash bug involving several pointers to a single object&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash when calls such as get PIECE_XZ were used in the Create function of a unit&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;SetSfxOccupy now updates correctly when unit is being transported&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for aircrafts auto landing to repair when health gets low&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Removed autorepair while unit is flying&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;When a unit has finished firing a burst the script function EndBurst&amp;lt;weaponnum&amp;gt; will now be called, use this instead of Fire&amp;lt;weaponnum&amp;gt; to switch pod/barrel etc to fire from to lessen friendly fire incidents&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Removed warning message when using transports&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;New map smd tag map/voidwater, creates a void where there would normally be water, this is a purely graphical effect,default 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New command .give, .give &amp;lt;num&amp;gt; &amp;lt;unitname&amp;gt; gives you num units of type unitname, requires cheats to be on, only use in singleplayer&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for aircrafts auto landing to repair when health gets low&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added command .kick &amp;lt;playername&amp;gt; that server can use to kick out players from game&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Updated global AI interface with GetNumUnitDefs() and GetUnitDefList()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.63b2=&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash when using new formation move commands&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Script interpreter now warns about incorrect piecenames in scripts instead of crashing&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.63b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed multi delete error in LosHandler&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash with features defined in mapfile&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed problem with having more than one map in the same archive&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Pathmap display (F2) can now also show where selected building can be built (slow though, esp with large maps and buildings)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Spring now remember the last a: etc prefix used in chat msgs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Resurrecting a unit now cost half the energy of building it&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Changed so spring can keep several different path precalcs on disk for a single map, this will save recalculations for ppl switching mods a lot&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added CMD_WAIT command to have units wait for a transport. Can be issued with the W key, can also be used to que up stuff and then releasing the unit to do it.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added tag &amp;quot;LIGHT\\SpecularSunColor&amp;quot; to smd file, modifies the color of the specular highlights on units, defaults to LIGHT\\UnitSunColor&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added tag &amp;quot;isAirBase&amp;quot; to unit FBI file, sets if the units that are being transported will be stunned or not, defaults to 0.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Spring can now use up to 16 weapons, use Weapon&amp;lt;1-16&amp;gt; and BadTargetCategory&amp;lt;1-16&amp;gt; in fbi file and QueryWeapon&amp;lt;1-16&amp;gt; AimWeapon&amp;lt;1-16&amp;gt; AimFromWeapon&amp;lt;1-16&amp;gt; FireWeapon&amp;lt;1-16&amp;gt; functions in scripts. Primary,secondary etc is aliased to weapon 1-3 but try not to mix old and new names in the same unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new fbi tag WeaponSlaveTo&amp;lt;x&amp;gt;=y, this will force the weapon x to use the same target as weapon y (y must be a lower numbered weapon than x). Might be usefull for say a mech like unit with many different weapons that should target in the same direction.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new fbi tags WeaponMainDir&amp;lt;1-16&amp;gt; and MaxAngleDif&amp;lt;1-16&amp;gt;. WeaponMainDir is a vector and defines the center direction of a cone in which the weapon can aim while MaxAngleDif defines how broad the cone is. Default WeaponMainDir = 0 0 1; (forward) and MaxAngleDif=360; (can fire everywhere)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for loading TA:K COB files and implemented the TA:K-specific opcode play-sound.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added some simple formation handling to the standard groups, hold alt on move to make them form an aproximate square and drag mouse to make them form up behind a front&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added missile tdf tag wobble, this is in the same as turnrate except that it will turn in random directions instead of toward the target,default 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added missile tdf tag trajectoryHeight, this sets in how high an arc the missile will move toward the target,0 = straight, 1=45 degree above, can be anything&amp;gt;=0, default 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New start file tag LimitDgun, if 1 it restricts dgunning to a radius around your startpos, size depending on mapsize, default 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New start file tags AllyTeam&amp;lt;x&amp;gt;/StartRect&amp;lt;Top.Bottom,Left,Right&amp;gt;, allows host to define where different allyteams might start on the map, given in the range 0-1 and scaled with map size&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.62b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash when units exploded&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Mines no longer block terrain and can be overun (and if you are crazy built on top of :) ), removed ability for mines to hold fire since they would be completly undetectable.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Heightmap view (F1) now updates correctly when terrain changes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Pathcost view (F2) now works in non cheating mode but will then only show terrain modifiers&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed gunships being able to fly below ground when comming in on step slopes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Auto sharing now starts at 99% instead of 100% at startup meaning that there is less chance of the team losing resources because someone forgets to set it&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Installer associates .sdf files with spring.exe&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Spring.exe now accepts a demo filename on the commandline and starts playing it directly&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added tag &amp;quot;MAP\\DetailTex&amp;quot; to smd file to specifiy map specific detail texture, default is bitmap\detailtex2.bmp, map specific textures should be placed in maps directory.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added possibility for surface of units to be shiny/reflective by using the alpha channel of the textures&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Addded command .take, will take the units from all teams allied with you that is missing a player (due to disconnect etc) and transfer them to your team&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.61b2=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added tag &amp;quot;WATER\\WaterTexture&amp;quot; to smd file to specify another texture for the map than the default ocean.jpg (mapspecific water textures should be in the maps directory)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added tag &amp;quot;WATER\\WaterSurfaceColor&amp;quot; to smd file, changes the surface color of the water when using reflective water (default is 0.75 0.8 0.85 ).&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed error msg while loading certain jpeg files&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed spawn.txt not being readable from archives&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed problem with reading large files from sd7 archives (such as skyboxes)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0.61b1 --------------------------------------&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash in weapon aiming&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed some other crashes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixes some memory errors&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed aircrafts landing outside map&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed infinitly rotating starburst missiles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed different tracks getting superimposed on each other&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Plasma cannons should now detect mountains in the fire path better&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;The generated path information for maps is now stored zipped in the subdirectory &amp;quot;paths&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added scar marks on map to explosions&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Can now control spacing when rowbuilding using the forward/back buttons (xButtons) on mouse&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Spring now attempts to find bmp or jpg files in bitmaps\loadpictures to use as background while loading&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Some messages now show their location on the minimap&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Moved spawn.txt into xta archive by default to allow replacements by other mods, and replaced it with &amp;quot;Storm Easy AI v1.0&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New weapon tdf value, TargetMoveError, makes the weapon worse at hitting moving targets, default 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New weapon tdf value, MovingAccuracy, replaces the normal accuracy value while the unit is moving, defaults to normal accuracy of weapon&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New weapon tdf value, thickness, controls the thickensess of lasers, default 2&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New weapon tdf value, intensity, controls the alpha value of lasers, default 0.9&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New smd terraintype value, receivetracks, if this is 0 there wont be any tracks from units on this terrain type, default 1&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.60b1=&lt;br /&gt;
*&amp;lt;span&amp;gt;Added tag SmoothAnim=0/1 to the fbi. If it is 1, unis will use animation interpolation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added MAP\\WATER\\WaterPlaneColor tag to maps to set the color of the waterplane beneath the ground&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added MAP\\ATMOSPHERE\\SkyBox tag to maps to use a dds cubemap as a sky instead of the cloud rendering&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added an optional BuildPic tag to the units so they can use other than pcx buildpics&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash when unit closed in on their destination&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Slopes are now calculated differently&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Random start order should now be more random&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed commiting delayed animations before using getunitval&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Radar now jams everyones radar including your own. We will see how this turns out.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New map format, adds ability to read texture from external (shared) files and a new terrain type overlay map&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Made ballistic weapons range somewhat more dependent on relative height of weapon and target&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Paralyzer tag for weapons now work&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;CanCapture tag for units now works&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;HighTrajectory now requires a HighTrajectory tag in the unit file (0=only low, 1=only high,2=choose)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Ground under DT/FW get same kind of protection as under buildings, we will see how it works out&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;&amp;quot;Slow&amp;quot; explosions, stuff far away from big explosions will have their damage delayed a bit&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added globalai interface and changed groupai interface a bit&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added resurrection capability&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for regular zip archives. Using extension &amp;quot;sdz&amp;quot; to avoid confusion.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for 7zip archives. (http://www.7-zip.org/). Using extension &amp;quot;sd7&amp;quot; to avoid confusion. Note that it is probably not a good idea to use solid archives since Spring does not access the files sequentially.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added beamlaser type weapon&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added possibility of units leaving tracks on map&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added some new options to the game start file&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added new camera mode rotatable overhead camera&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added Flare capability to units to decoy incoming missiles&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added boot option for battleroom host&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Hopefully fixed unit sync and some other bugs in battleroom&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.51b1=&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed a cob animation related crash&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed crash using &amp;quot;simple formation ai&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed auto resource sharing, could share to enemies or not at all before&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Floating features now works&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Con air now stay within radius of build object better&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Spectators can no longer select start pos&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Yet more pathfinding/movement fixes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed timeout when host calculating paths&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New ingame command for host .nopause , prevents player from pausing game. Also harder to spam log with changespeed msgs now.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Changed targeting calculations, now switch from badtargetcategory targets faster and never switch to them from other sort of targets even if those go out of los/radar&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Changed so several units cant reclaim a feature at once&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Flakker like units can now target fast units better&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.50b2=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Changed default DamageModifier to be 1 instead of 0&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed so units no longer can dip slightly into lava and explode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Adds a random enemies script for those that really want to test in single player. The enemies are read from spawn.txt (frame/enemyname pairs) and spawns at startpos 1-3 randomly&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.50b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for set/get of unit variable ACTIVATION (allowing solars to close under attack for example)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added call to cob function SetMaxReloadTime for better ta unit compatibility&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added stack boundary checking to cob interpreter&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed buffer overrun problems in the sunparser&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed threads contending over single global netbuf (hopefully no more netmsg errors)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Now connects from the same udp port as connecting to (semi random before)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Units can no longer move over infinite sloops&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Improved the pathfinder/movesystem&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Contruction units can no longer repair themselves&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Repair/Build/Reclaim now turn of cloak&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Unit paths are now only visible when cheats are enabled in debug mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;F2 now shows the map from a pathfinding perspective if cheats are enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed grass not being drawn&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Previously visible buildings now stays on the map in a ghost state&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added support for larger maps&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added some more range circles&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added keyboard bindings for mousewheel (pageup/down as default)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added guard order to aircrafts&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New .smd command MAP/WATER/WaterDamage. Indicates the amount of damage per second units take for being in &amp;quot;water&amp;quot;. Make it &amp;gt;1000 to prevent ground units from entering water entirely, &amp;gt;10000 prevents hovers from moving over water.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New in game commands for host .setmaxspeed .setminspeed sets the maximum and minimum game speeds&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.41b1=&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Removed log spam with Use of GetPieceDir..&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed &amp;quot;Error looking up server from ip&amp;quot; errors when trying to connect&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed zero size units bug&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Can no longer overflow network buffer with large build orders&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Non square maps no longer crash&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed some random crash bugs&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added more filtering to the server and clients to filter out invalid net msgs&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Host can now force start the game with ctrl+return if not everyone show up&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed repeat order for factories&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Units can no longer move onto terrain they cant move off (boats on land etc)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Units can no longer die due to getting outside map&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Changed the alignment on buildings, fixes two buildings qued beside each other ending up blocking each other&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Buildings no longer decay when builder has slow animation&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Radar/jammer units now correctly updated when changing team&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;New .smd value, MAP/AutoShowMetal. Set it to 0 if you dont want players to switch to metalmap view when selecting an extractor. (because you have created visible metal deposits on the map)&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;New .smd value, MAP/MapHardness. Set how hard it is to create craters in map, default 100.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Made it slightly easier to build buildings on slopes&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Made it somewhat harder to dig deep holes&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;- Lobby changes&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;span&amp;gt;Added extended ascii support in chatrooms.  Can now use accent characters&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added test button to battle host menu. It will tell the server to try and conncet to you on the port you specified, letting you know if others will be able to as well.&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Now can tell which battles are in progress, and which are still open&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed bug that allowed more than the max number of players into a room&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added ability to launch a browser when links are sent in a chatroom&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Added unit syncing.  Now if users have different units, the differences are disabled&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span&amp;gt;Fixed a bug that allowed invalid log in names to be submitted&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=0.40b2=&lt;br /&gt;
&lt;br /&gt;
First public release&amp;lt;/b&amp;gt;[[category:Development]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Chili-Classes&amp;diff=4129</id>
		<title>Chili-Classes</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Chili-Classes&amp;diff=4129"/>
		<updated>2013-09-11T06:47:21Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Created page with &amp;quot;Development &amp;lt; Chili &amp;lt; {{FULLPAGENAME}} {{stub}} Chili classes are the elements (panels, grids, etc.) that make up the game GUI. The .lua .lua files are st...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gamedev:Main|Development]] &amp;lt; [[Chili]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
{{stub}}&lt;br /&gt;
Chili classes are the elements (panels, grids, etc.) that make up the game GUI. The .lua .lua files are stored in the directory &amp;lt;code&amp;gt;LuaUI/Widgets/Chili/controls&amp;lt;/code&amp;gt;. Displayed elements such as window, as distinct from non-control classes (specifically, font objects and the screen) are referred to as &#039;&#039;&#039;controls&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The default Chili classes can be found [https://github.com/jk3064/chiliui/tree/master/chili/controls here].&lt;br /&gt;
&lt;br /&gt;
==Data Types==&lt;br /&gt;
Tags may be one of the following data types:&lt;br /&gt;
* &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; - A number with or without decimals.&lt;br /&gt;
* &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; - A value which can be &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; - Text, or more precisely a string of alphanumeric characters.&lt;br /&gt;
* &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; - An array of colors, in RGBA format.&lt;br /&gt;
* &amp;lt;code&amp;gt;number[4]&amp;lt;/code&amp;gt; - An array of numbers; used for positioning, etc.&lt;br /&gt;
==Details==&lt;br /&gt;
Chili classes use OOP with inheritance, with the following hierarchy:&lt;br /&gt;
 object&lt;br /&gt;
 |_font&lt;br /&gt;
 |_screen&lt;br /&gt;
 |_control&lt;br /&gt;
  |_button&lt;br /&gt;
    |_image&lt;br /&gt;
  |_checkbox&lt;br /&gt;
  |_colorbars&lt;br /&gt;
  |_label&lt;br /&gt;
  |_layoutpanel&lt;br /&gt;
    |_imagelistview&lt;br /&gt;
    |_grid&lt;br /&gt;
    |_stackpanel&lt;br /&gt;
    |_treeview&lt;br /&gt;
  |_panel&lt;br /&gt;
  |_progressbar&lt;br /&gt;
  |_scrollpanel&lt;br /&gt;
  |_textbox&lt;br /&gt;
  |_trackbar&lt;br /&gt;
  |_treeview&lt;br /&gt;
   |_treeviewnode&lt;br /&gt;
  |_window&lt;br /&gt;
&lt;br /&gt;
Consequently, it is possible for widgets to define their own Chili classes (discussed below).&lt;br /&gt;
&lt;br /&gt;
Each Chili control has one parent (&amp;lt;code&amp;gt;Chili.screen0&amp;lt;/code&amp;gt; or another Chili control) and any non-negative number of children. Position is specified relative to the parent, taking into account the parent&#039;s &amp;lt;code&amp;gt;padding&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;itemMargin&amp;lt;/code&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
==Classes==&lt;br /&gt;
===Object===&lt;br /&gt;
The base Chili object class. It should &#039;&#039;not&#039;&#039; be used directly.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = classname&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;object&amp;quot;&lt;br /&gt;
|description = The class name.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = hidden&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the object hidden?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = disableChildrenHitTest&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If true, this object&#039;s children are not clickable, draggable, etc. - their mouse events are not processed.}}&lt;br /&gt;
&lt;br /&gt;
===Control===&lt;br /&gt;
This is the base class for all Chili controls, specifying common properties. It should &#039;&#039;not&#039;&#039; be used directly.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;General tags&#039;&#039;&#039;&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tooltip&lt;br /&gt;
|type = string&lt;br /&gt;
|default = nil&lt;br /&gt;
|description = The control&#039;s tooltip.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = skinName&lt;br /&gt;
|type = string&lt;br /&gt;
|default = nil&lt;br /&gt;
|description = Specifies the control to use a skin other than the default one.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Size tags&#039;&#039;&#039;&lt;br /&gt;
{{tag&lt;br /&gt;
|name = width&lt;br /&gt;
|type = number OR string&lt;br /&gt;
|description = The width of the control. This can be a number of pixels, or a percentage value enclosed in a string, e.g. &amp;quot;50%&amp;quot; means half as wide as the parent.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = height&lt;br /&gt;
|type = number OR string&lt;br /&gt;
|description = The height of the control. This can be a number of pixels, or a percentage value enclosed in a string, e.g. &amp;quot;50%&amp;quot; means half as wide as the parent.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minWidth&lt;br /&gt;
|type = number&lt;br /&gt;
|default = 10 (50 for windows)&lt;br /&gt;
|description = The control&#039;s minimum width.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minHeight&lt;br /&gt;
|type = number&lt;br /&gt;
|default = 10 (50 for windows)&lt;br /&gt;
|description = The control&#039;s minimum height.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxWidth&lt;br /&gt;
|type = number&lt;br /&gt;
|default = 1e9&lt;br /&gt;
|description = The control&#039;s maximum width.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxHeight&lt;br /&gt;
|type = number&lt;br /&gt;
|default = 1e9&lt;br /&gt;
|description = The control&#039;s maximum height.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = autosize&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the control automatically resize to fit its children?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = savespace&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;autosize&amp;lt;/code&amp;gt; is enabled, it shrinks the control to the minimum needed space; if disabled &amp;lt;code&amp;gt;autosize&amp;lt;/code&amp;gt; &#039;&#039;normally&#039;&#039; only enlarges the control.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fixedratio&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does this control attempt to maintain its original aspect ratio when resized?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = resizable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can this control be resized outside of tweakmode?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tweakResizable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can this control be resized in tweakmode?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positioning tags&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
These tags can be combined in different ways with each other and the width/height tags to precisely define the bounds of the element.&lt;br /&gt;
{{tag&lt;br /&gt;
|name = x&lt;br /&gt;
|type = number&lt;br /&gt;
|description = The distance between the left edge of the control and that of its parent.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = y&lt;br /&gt;
|type = number&lt;br /&gt;
|description = The distance between the top edge of the control and that of its parent.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = right&lt;br /&gt;
|type = number&lt;br /&gt;
|description = The distance between the right edge of the control and that of its parent.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bottom&lt;br /&gt;
|type = number&lt;br /&gt;
|description = The distance between the bottom edge of the control and that of its parent.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = draggable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can this control be dragged around outside of tweakmode?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tweakDraggable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can this control be dragged around in tweakmode?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing tags&#039;&#039;&#039;&lt;br /&gt;
{{tag&lt;br /&gt;
|name = padding&lt;br /&gt;
|type = number[4]&lt;br /&gt;
|default = {5, 5, 5, 5}&lt;br /&gt;
|description = How much space there is between the borders of the control and its children. Numbers are for left, top, right and bottom.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = backgroundColor&lt;br /&gt;
|type = color&lt;br /&gt;
|default = {0.8, 0.8, 1.0, 0.4} (can be overridden by skin)&lt;br /&gt;
|description = This is the background color of certain controls, particularly Windows.}}&lt;br /&gt;
&lt;br /&gt;
===Window===&lt;br /&gt;
This is the basic container for all other controls. It is the only one that can be moved around by the user and responds to the docking widget. It can be made invisible for a borderless element, or to allow another control such as a Panel to draw the background.&lt;br /&gt;
&lt;br /&gt;
===Panel===&lt;br /&gt;
A background element, similar to Window but drawn differently and without the resize/drag functions.&lt;br /&gt;
&lt;br /&gt;
===Button===&lt;br /&gt;
Does things when clicked. Comes with its own implementation of &amp;lt;code&amp;gt;HitTest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MouseDown&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MouseUp&amp;lt;/code&amp;gt;, making it readily usable for this purpose.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = caption&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;button&amp;quot;&lt;br /&gt;
|description = A caption written on the button.}}&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:Stub&amp;diff=23097</id>
		<title>Template:Stub</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Template:Stub&amp;diff=23097"/>
		<updated>2013-09-11T05:53:26Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Created page with &amp;quot;:&amp;#039;&amp;#039;This article is a stub. You can help the Spring project by expanding it.&amp;#039;&amp;#039;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&#039;&#039;This article is a stub. You can help the Spring project by expanding it.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:WeaponDefs&amp;diff=8768</id>
		<title>Gamedev:WeaponDefs</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:WeaponDefs&amp;diff=8768"/>
		<updated>2013-09-11T05:47:21Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Add link back to gamedev page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gamedev:Main|Development]] &amp;lt; [[Gamedev:Main]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
WeaponDef files are .lua files stored in the &amp;lt;code&amp;gt;Weapons/&amp;lt;/code&amp;gt; directory of a Spring Game. Alternatively they can be integrated into [[Units-UnitDefs|UnitDefs]].&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
WeaponDef files have one purpose; to define the properties of weapons. They are the main description file for what attributes your weapon should have and how it should behave.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which loads the tags from these files is viewable here:&lt;br /&gt;
&lt;br /&gt;
* {{sourcelink|file=rts/Sim/Weapons/WeaponDef.cpp}}&lt;br /&gt;
&lt;br /&gt;
==Data Types==&lt;br /&gt;
Tags may be one of the following data types:&lt;br /&gt;
* &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; - An integer number&lt;br /&gt;
* &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; - A number with decimals.&lt;br /&gt;
* &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; - A value which can be &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; - Text, or more precisely a string of alphanumeric characters.&lt;br /&gt;
* &amp;lt;code&amp;gt;float[3]&amp;lt;/code&amp;gt; - A vector, with three &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; components, representing x, y and z axes (y is &#039;up&#039;).&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
There follows a comprehensive (certain deprecated tags are not present) list of the tags available, their data type, default value and a brief description of what they do. Bear in mind that the source code linked above is the ultimate reference when dealing with these tags. &lt;br /&gt;
&lt;br /&gt;
In lua tables keys (i.e. the tags) should be lower case, here they are represented in camelCase for readability. In your files you may use the &amp;lt;code&amp;gt;lowerkeys&amp;lt;/code&amp;gt; function on your final table to ensure the keys are properly cased.&lt;br /&gt;
&lt;br /&gt;
It is usual to name the returned WeaponDef table the internal &amp;lt;code&amp;gt;weaponName&amp;lt;/code&amp;gt; desired for the weapon.&lt;br /&gt;
&lt;br /&gt;
===Common===&lt;br /&gt;
The following tags are common to all or at least a majority of &#039;&#039;&#039;WeaponTypes&#039;&#039;&#039;, depending on the tag.&lt;br /&gt;
&lt;br /&gt;
====General====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = weaponType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;Cannon&amp;quot;&lt;br /&gt;
|description = Spring has 14 &#039;&#039;&#039;WeaponTypes&#039;&#039;&#039; which provide game developers with basic behaviours which they can customise to an extent with the &#039;&#039;&#039;WeaponDef&#039;&#039;&#039; tags. Some tags are specific to certain &#039;&#039;&#039;WeaponTypes&#039;&#039;&#039; and not implemented for others, [https://docs.google.com/spreadsheet/ccc?key=0Am5BbZxm93S9dEZXc1Q4dXR4TFRYTFM4NlR4OFJFdWc#gid=0 this two-way table] indicates which tags work for which types.}} The possible values are:&lt;br /&gt;
* [[#AircraftBomb|AircraftBomb]]&lt;br /&gt;
* [[#BeamLaser|BeamLaser]]&lt;br /&gt;
* [[#Cannon|Cannon]]&lt;br /&gt;
* [[#DGun|Dgun]]&lt;br /&gt;
* [[#EmgCannon|EmgCannon]]&lt;br /&gt;
* [[#Flame|Flame]]&lt;br /&gt;
* [[#LaserCannon|LaserCannon]]&lt;br /&gt;
* [[#LightningCannon|LightningCanon]]&lt;br /&gt;
* [[#Melee|Melee]]&lt;br /&gt;
* [[#MissileLauncher|MissileLauncher]]&lt;br /&gt;
* [[#Rifle|Rifle]]&lt;br /&gt;
* [[#Shield (WeaponType)|Shield]]&lt;br /&gt;
* [[#StarburstLauncher|StarburstLauncher]]&lt;br /&gt;
* [[#TorpedoLauncher|TorpedoLauncher]]&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = name&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;Weapon&amp;quot;&lt;br /&gt;
|description = The descriptive name of the weapon as listed in FPS mode.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turret&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit aim within an arc (up-to and including full 360Â° turret traverse) or always aim along the owner&#039;s heading?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noSelfDamage&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the weapon&#039;s explosion damage the unit which fires it? Useful for preventing bombers with high-yield weapons destroying themselves.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = impactOnly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon only deal damage through direct hits and not &#039;splash&#039; damage through {{taglink|areaOfEffect}}?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noExplode&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon explode on impact with a target or continue through? Note that these weapons will do damage every single frame they are inside the [[Unit_collision_volumes|collision volume]] of an object, underground or under water, massively multiplying their damage.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = burnblow&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon explode when it reaches its maximum range or continue on its path? The name is an [[OTAism]].}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = range&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 10.0&lt;br /&gt;
|description = The maximum range in [[elmo]]s that the weapon can fire at.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = weaponVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The velocity in [[elmo]]s per second of the weapon projectile.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = reloadTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The time in seconds between shots fired.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalPerShot&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Metal used per shot. If the specified amount is not available, the weapon cannot be fired. Can also be used to specify how much a {{taglink|stockpile}} weapon will cost to build.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyPerShot&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Energy used per shot. If the specified amount is not available, the weapon cannot be fired. Can also be used to specify how much a {{taglink|stockpile}} weapon will cost to build.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = myGravity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Overrides the map gravity for ballistic weapons. The default of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; disables the tag in favour of map gravity.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fireStarter&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The percentage chance (&amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;100.0&amp;lt;/code&amp;gt;) of the weapon setting fire to static map features on impact.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cameraShake&lt;br /&gt;
|type = float&lt;br /&gt;
|default = damage (0.0 for paralyzers)&lt;br /&gt;
|description = Passed to the [[LuaCallinReturn#Game_Events:|ShockFront() callin]] as the first argument. Intended as a means to make the camera shake if in range of detonation.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stockpile&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does each round of the weapon have to be built and stockpiled by the player? Will only correctly function for the first of each stockpiled weapons a unit has.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stockpileTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = reloadTime&lt;br /&gt;
|description = The time in seconds taken to stockpile one round of the weapon.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptedByShieldType&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0 (See description)&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of shields that can intercept this weapon. Each digit of binary that is set to one means that a shield with the corresponding digit in its {{taglink|interceptType}} will intercept this weapon. The defaults are as follows:&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - [[#Cannon]] and [[#EmgCannon]]&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - [[#LaserCannon]] and [[#BeamLaser]]&lt;br /&gt;
* &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; - [[#MissileLauncher]] and [[#StarburstLauncher]]&lt;br /&gt;
* &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; - [[#AircraftBomb]]&lt;br /&gt;
* &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; - [[#Flame]]&lt;br /&gt;
* &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; - [[#TorpedoLauncher]]&lt;br /&gt;
* &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; - [[#LightningCannon]]&lt;br /&gt;
* &amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt; - [[#Rifle]]&lt;br /&gt;
* &amp;lt;code&amp;gt;256&amp;lt;/code&amp;gt; - [[#Melee]]&lt;br /&gt;
(See [[Shield Interception Tag Use]]).}}&lt;br /&gt;
&lt;br /&gt;
====Collision &amp;amp; Avoidance====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Should the weapon avoid firing if terrain blocks the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidFriendly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Should the weapon avoid firing if a friendly unit is in the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidFeature&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Should the weapon avoid firing if a static map feature is in the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidNeutral&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the weapon avoid firing if a neutral unit is in the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideEnemy&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with enemy units or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideFriendly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with friendly units or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideFeature&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with static map features or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideNeutral&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with neutral units or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with terrain or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionSize&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.05 (0.5 for [[#Flame]] and [[#LaserCannon]], 10.0 for [[#Dgun]])&lt;br /&gt;
|description = The radius used in collision calculations. For non-instant-hit weapons which do not use a 3D {{taglink|model}}.}}&lt;br /&gt;
&lt;br /&gt;
====Targeting &amp;amp; Accuracy====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = commandFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines if the weapon will automatically fire on enemy units in range or only when manually ordered to attack.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canAttackGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Determines if the weapon can be force-fired on ground positions or only fire on targeted units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = waterWeapon&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines if the weapon can pass through water and target underwater units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fireSubmersed&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = waterWeapon&lt;br /&gt;
|description = Determines if the weapon can fire whilst underwater.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = targetBorder&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (1.0 for [[#Melee]])&lt;br /&gt;
|description = Controls whether the weapon aims for the centre or the edge of its target&#039;s [[Unit_collision_volumes|collision volume]]. Clamped between &amp;lt;code&amp;gt;-1.0&amp;lt;/code&amp;gt; - target the far border, and &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; - target the near border.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cylinderTargeting&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (1.0 for [[#Melee]])&lt;br /&gt;
|description = Controls whether the weapon range is calculated in a sphere or a cylinder. The height of the cylinder is determined by the value of this tag multiplied by the {{taglink|range}}. Clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;128.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tolerance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 3000.0&lt;br /&gt;
|description = The amount to which the weapon&#039;s &amp;quot;real&amp;quot; aim can be off while the weapon will still be able to fire accurately at the target. For {{taglink|turret|false}} or {{taglink|fixedlauncher|true}} weapons this determines in what arc the unit will fire.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = targetMoveError&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The degree to which a weapon&#039;s aiming will fail to keep up with its target&#039;s movement. If set very low or not set at all, a weapon will lead its target and almost always hit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = leadLimit&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -1.0&lt;br /&gt;
|description = Limits the maximum distance a unit will lead a target. The default of &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; allows an infinite distance.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = leadBonus&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Controls how experience boosts the weapon&#039;s target leading. Is multiplied with the unit&#039;s experience and added to the {{taglink|leadLimit}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = predictBoost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (0.5 for {{taglink|burnblow|true}} weapons)&lt;br /&gt;
|description = Controls how well the weapon predicts unit speeds. Works in a similar way to  {{taglink|targetMoveError}} except that it is 1-dimensional. This tag spreads the shots in a line based on the direction of the target whereas {{taglink|targetMoveError}} spreads the shots all around based on the movement.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = heightMod&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.2 (0.8 for [[#Cannon]], 1.0 for [[#BeamLaser]] and [[#LightningCannon]])&lt;br /&gt;
|description = Changes the spherical weapon range into an ellipsoid. Values above &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; mean the weapon cannot target as high as it can far, values below &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; mean it can target higher than it can far. For example &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt; would allow the weapon to target twice as high as far.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = proximityPriority&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = Acts as a multiplier for the distance to the target in the priority calculation. Note that negative values make weapons prefer distant targets.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = accuracy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How accurate the weapon is. Lower values are more accurate. Accuracy is relative to the distance to the target; for instance, if the target is very close, even a very high value will probably still hit. If a target is very far away, even a very low value will likely cause the weapon to miss.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = movingAccuracy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = accuracy&lt;br /&gt;
|description = A weapon&#039;s {{taglink|accuracy}} whilst the owning unit is moving.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sprayAngle&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How wide the the angle of a burst from a [[#Bursts|burst weapon]] can be. Very similar to {{taglink|accuracy}}, except that this tag affects each projectile in a burst, whilst the former does not.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = ownerExpAccWeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (See description)&lt;br /&gt;
|description = A multiplier to {{taglink|accuracy}} and {{taglink|sprayAngle}} that reduces inaccuracy as a units experience increases. Defaults are as follows:&lt;br /&gt;
* &amp;lt;code&amp;gt;0.9&amp;lt;/code&amp;gt; - [[#Cannon]], [[#Rifle]]&lt;br /&gt;
* &amp;lt;code&amp;gt;0.7&amp;lt;/code&amp;gt; - [[#LaserCannon]], [[#BeamLaser]], [[#StarburstLauncher]]&lt;br /&gt;
* &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt; - [[#MissileLauncher]], [[#LightningCannon]], [[#EmgCannon]], [[#DGun]]&lt;br /&gt;
* &amp;lt;code&amp;gt;0.2&amp;lt;/code&amp;gt; - [[#Flame]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = targetable&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|special = {{new|92.0}} Previously only for [[#StarburstLauncher]]&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of weapon that can intercept this weapon. Each digit of binary that is set to one means that a weapon with the corresponding digit in its {{taglink|interceptor}} tag will intercept this weapon. Instant-hitting weapons such as [[#BeamLaser]], [[#LightningCannon]] and [[#Rifle]] cannot be targeted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptor&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|special = {{new|92.0}} Previously only for [[#StarburstLauncher]]&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of weapons that this weapon can intercept. Each digit of binary that is set to one means that a weapon with the corresponding digit in its {{taglink|targetable}} tag will be intercepted by this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptSolo&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|special = {{new|92.0}} &lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; no other interceptors may target the same projectile.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = coverage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = {{new|92.0}} Previously only for [[#StarburstLauncher]]&lt;br /&gt;
|description = The radius in [[elmo]]s within which an {{taglink|interceptor}} weapon will fire on {{taglink|targetable}} weapons.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Bouncing====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = waterBounce&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon bounce on water impacts?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = groundBounce&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon bounce on ground impacts?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bounceSlip&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The decimal-percentage amount of horizontal velocity a projectile keeps when it bounces.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bounceRebound&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The decimal-percentage amount of vertical velocity a projectile keeps when it bounces.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = numBounce&lt;br /&gt;
|type = int&lt;br /&gt;
|default = -1&lt;br /&gt;
|description = The number of times the weapon will bounce on impact before exploding. The default value of &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; allows infinite bounces (at least until velocity reaches 0).}}&lt;br /&gt;
&lt;br /&gt;
====Area Of Effect, Impulse &amp;amp; Cratering====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = areaOfEffect&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 8.0 * 0.5&lt;br /&gt;
|description = The &#039;&#039;diameter&#039;&#039; in [[elmo]]s in which the weapons explosion will cause damage.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = craterAreaOfEffect&lt;br /&gt;
|type = float&lt;br /&gt;
|default = areaOfEffect * 0.5&lt;br /&gt;
|description = The &#039;&#039;radius&#039;&#039; in [[elmo]]s in which the weapons explosion will cause terrain cratering.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = edgeEffectiveness&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Determines what percent of a weapon&#039;s maximum damage value will be applied to units within the weapon&#039;s {{taglink|areaOfEffect}}. Falls off from the epicentre according to the formula &amp;lt;code&amp;gt;damageApplied = damage * [(areaOfEffect - distToUnit) / (areaOfEffect - (distToUnit * edgeEffectiveness))]&amp;lt;/code&amp;gt;, a graph of the function for various values is available [[Media:EdgeEffectiveness.png|here]].}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explosionSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = See description&lt;br /&gt;
|description = The speed at which the weapon&#039;s explosion propagates from the epicentre. The default is calculated by this complex formula: &amp;lt;code&amp;gt;defExpSpeed = {8.0 + [max(30.0, default_damage / 20.0) * 2.5]} / {9.0f + [sqrt(max(30.0, default_damage / 20.0f)) * 0.7]} * 0.5&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = impulseFactor&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = A multiplier to the impulse given to units within the explosion {{taglink|areaOfEffect}}, which is otherwise equal to the damage dealt after {{taglink|edgeEffectiveness}} is taken into account. For [[#Melee]] weapons this is instead multiplied by the owning unit&#039;s mass (See [[Units-UnitDefs#Tag:mass|Units-UnitDefs]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = impulseBoost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = A constant amount added to the weapon&#039;s impulse, regardless of distance from the epicentre or the damage potential of the explosion, prior to the application of {{taglink|impulseFactor}}}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = craterMult&lt;br /&gt;
|type = float&lt;br /&gt;
|default = impulseFactor&lt;br /&gt;
|description = A multiplier to depth of terrain crater the weapon&#039;s explosion will create, which is otherwise based on the damage potential.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = craterBoost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = A constant amount, added to the weapon&#039;s cratering depth before the application of {{taglink|craterMult}}.}}&lt;br /&gt;
&lt;br /&gt;
====Bursts====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = burst&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = How many shots to fire per burst.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = burstRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.1&lt;br /&gt;
|description = The time in seconds between shots in a burst. Note that {{taglink|reloadTime}} starts to count down from the &#039;&#039;first&#039;&#039; round fired, not the last so if &amp;lt;code&amp;gt;reloadTime &amp;lt; burst * burstRate&amp;lt;/code&amp;gt; the weapon will fire continuously.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = projectiles&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = How many projectiles released per shot (shotgun style). e.g. a weapon with {{taglink|burst|5}}, {{taglink|burstRate|0.5}} and {{taglink|projectiles|2}} will shoot 5 lots of 2 for 10 projectiles total, with gaps of 0.5 seconds, before waiting for {{taglink|reloadTime}}. Best used in conjunction with {{taglink|sprayAngle}} or changing the firing piece using [[Animation-LuaCallins#Weapons|ShotX]] as otherwise they&#039;ll all be clumped in one shot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Paralyzing====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = paralyzer&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the weapon a paralyzer? If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the weapon only stuns enemy units and does not cause damage in the form of lost hit-points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = paralyzeTime&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 10&lt;br /&gt;
|description = Determines the maximum length of time in seconds that the target will be paralyzed. The timer is restarted every time the target is hit by the weapon. Cannot be less than &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Dynamic Damage====&lt;br /&gt;
The following set of tags allow for a weapon&#039;s damage potential to vary with the distance to its target.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageExp&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Exponent of the range-dependent damage formula, the default of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; disables dynamic damage, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means linear scaling, &amp;lt;code&amp;gt;2.0&amp;lt;/code&amp;gt; quadratic and so on.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageMin&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum floor value that range-dependent damage can drop to.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageRange&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = If set to non-zero values the weapon will use this value in the range-dependant damage formula instead of the actual {{taglink|range}}. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageInverted&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the damage curve is inverted i.e. the weapon does more damage at greater ranges as opposed to less.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Sounds====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundTrigger&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false (true for [[#Melee]], [[#Rifle]] and non-beamBurst [[#BeamLaser]])&lt;br /&gt;
|description = Does the weapon play {{taglink|soundStart}} for every round in a burst or only once for each salvo?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundStart&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a &#039;&#039;&#039;SoundItem&#039;&#039;&#039; (See [[Sounds.lua]]) or filename of a sound to play when the weapon fires.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundHitDry&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a &#039;&#039;&#039;SoundItem&#039;&#039;&#039; (See [[Sounds.lua]]) or filename of a sound to play when the weapon collides with solid ground. Note that a [[#BeamLaser]] will play this sound every frame of its lifetime.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundHitWet&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a &#039;&#039;&#039;SoundItem&#039;&#039;&#039; (See [[Sounds.lua]]) or filename of a sound to play when the weapon collides with water. Note that a [[#BeamLaser]] will play this sound every frame of its lifetime.}}&lt;br /&gt;
&lt;br /&gt;
====Visuals====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cegTag&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name, without prefixes, of a [[CEG]] to be emitted by the projectile each frame.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = intensity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.9 (0.2 for [[#Cannon]])&lt;br /&gt;
|description = Alpha transparency for non-3D model projectiles. Lower values are more opaque, but &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; will cause the projectile to disappear entirely.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = model&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The filename of a 3D model to use when rendering the projectile. Note that only the root piece of a projectile model is rendered. Currently only for [[#Cannon]], [[#LaserCannon]], [[#MissileLauncher]], [[#StarburstLauncher]] and [[#TorpedoLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explosionScar&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon&#039;s explosion leave a scar decal on the ground? For all types except [[#Melee]] and [[#Rifle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = alwaysVisible&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the weapon is always rendered regardless of whether or not it is in LOS range of a player&#039;s units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = rgbColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {1.0, 0.0, 0.0} (See Description)&lt;br /&gt;
|description = The primary colour for sprite rendering weapons. Additional defaults are as follows:&lt;br /&gt;
* [[#Cannon]] - &amp;lt;code&amp;gt;{1.0, 0.5, 0.0}&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[#EmgCannon]] - &amp;lt;code&amp;gt;{0.9, 0.9, 0.2}&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explosionGenerator&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a [[CEG]], with &amp;lt;code&amp;gt;custom:&amp;lt;/code&amp;gt; prefix, to spawn as the weapon&#039;s explosion. Does not currently work for [[#Melee]] and [[#Rifle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bounceExplosionGenerator&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = For weapons which can use {{taglink|groundBounce|true}}, the name of a [[CEG]], with &amp;lt;code&amp;gt;custom:&amp;lt;/code&amp;gt; prefix, to spawn when weapon the bounces.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture1&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The projectile texture for [[#AircraftBomb]], [[#Cannon]], [[#EmgCannon]], [[#Flame]]; beam texture for [[#LaserCannon]], [[#BeamLaser]], [[#LightningCannon]]; flare texture for [[#MissileLauncher]], [[#StarburstLauncher]] and dome texture for the [[#Shield]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture2&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The end-of-beam texture for [[#LaserCannon]], [[#BeamLaser]] and {{taglink|smoketrail}} texture for [[#MissileLauncher]], [[#StarburstLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture3&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = Flare texture for [[#BeamLaser]], or muzzle texture if {{taglink|largeBeamLaser|true}}. Also used as the flame texture for [[#StarburstLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture4&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = Flare texture for [[#BeamLaser]] with {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===AircraftBomb===&lt;br /&gt;
Drops a ballistic projectile at the same movement vector as the unit itself. Intended only for aircraft. Visually drawn as a billboarded sprite as used by the [[#Cannon]], but more commonly used with a 3D model.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====AircraftBomb Visuals====&lt;br /&gt;
&lt;br /&gt;
When not using a {{taglink|model}}, the AircraftBomb is the same as [[#Cannon Visuals]].&lt;br /&gt;
&lt;br /&gt;
===BeamLaser===&lt;br /&gt;
An instant-hit weapon which spawns a beam and does a portion of its total damage each frame. Cannot be [[Animation-LuaCallouts#Effects|script emitted]] if it has a {{taglink|beamTime}} longer than one frame. Visually drawn as a [http://en.wikipedia.org/wiki/Star_Trek Star Trek] Phaser-style laser weapon. The {{taglink|largeBeamLaser}} tag allows changing the visual effect of the laser, such as using a tileable, scrolling texture without changing the behaviour.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minIntensity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum percentage the weapon&#039;s damage can fall-off to over its range. Setting to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; will disable fall off entirely. Unrelated to the visual-only {{taglink|intensity}} tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How long in seconds to fire the laser before waiting for {{taglink|reloadTime}} to start. Damage is distributed over the duration of the {{taglink|beamTime}}, and the weapon will aim to hit the target when the beam is in the middle of its {{taglink|beamTime}} (i.e. using prediction).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamBurst&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Makes the laser fire a burst of beams that are all aimed towards the target (instead of aimed with the piece). A [[#BeamLaser]] can do its full damage with every shot if {{taglink|beamBurst}} is enabled. Disables {{taglink|beamTime}} in favour of the [[#Bursts|burst tags]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sweepFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Makes the laser continue firing while it aims for a new target, &#039;sweeping&#039; across the terrain. Somewhat unreliable.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====BeamLaser Visuals====&lt;br /&gt;
&lt;br /&gt;
See also {{taglink|thickness}} and {{taglink|coreThickness}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamTTL&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The time in frames for which the laser beam remains visible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamDecay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How fast the beam fades out. Each frame the {{taglink|intensity}} is multiplied by this value.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = laserFlareSize&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 15.0&lt;br /&gt;
|description = Determines the size of the firing flare.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = largeBeamLaser&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Changes the visual effect allowing tiling and scrolling of the texture and a pulsating firing flare.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tileLength&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 200.0&lt;br /&gt;
|description = Defines the length before the texture used is repeated (tiled). Only if {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = scrollSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 5.0&lt;br /&gt;
|description = Controls how fast the texture scrolls. Only if {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = pulseSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = Controls how fast the pulsating effect at the start of the beam is. Only if {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Cannon===&lt;br /&gt;
The default &#039;&#039;&#039;WeaponType&#039;&#039;&#039;. Fires a ballistic projectile, for the best result (without under/overshooting) the {{taglink|weaponVelocity}} should be set so as to give an elevation of 45Â° when firing at the maximum {{taglink|range}}. Substituting the angle into the [http://en.wikipedia.org/wiki/Trajectory#Range_and_height trajectory equation] and rearranging, we get: &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;weaponVelocity = âˆš(range * g)&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
where &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; is the map gravity, usually around &amp;lt;code&amp;gt;120&amp;lt;/code&amp;gt; for most Spring maps (You can use the {{taglink|myGravity}} tag if you want to be exact). Visually drawn as a billboarded sprite or 3D model. &lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = highTrajectory&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 2&lt;br /&gt;
|description = Can this weapon be fired in a high trajectory (&amp;gt;45Â° angle). Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - low trajectory only, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - high trajectory only or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - enables a high/low toggle button on the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = heightBoostFactor&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -1.0&lt;br /&gt;
|description = Controls the boost given to {{taglink|range}} by high terrain. Values &amp;gt; &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; result in increased range, &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; means the cannon has fixed range regardless of height difference to target. Any value &amp;lt; &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; (i.e. the default value) result in an automatically calculated value based on {{taglink|range}} and theoretical maximum range.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Cannon Visuals====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = size&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 2.0 + min(default_damage * 0.0025, {{taglink|areaOfEffect}} * 0.1)&lt;br /&gt;
|description = The drawing radius of the billboarded sprite. Also for [[#AircraftBomb Visuals]], [[#EmgCannon Visuals]] (default: &amp;lt;code&amp;gt;3.0&amp;lt;/code&amp;gt;) and [[#Flame Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = colorMap&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = A set of RGB colours to transition between over the projectile&#039;s lifetime. Can be given as a string of RGB digits or an image filename (See [[CColorMap]]). Also for [[#Flame Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sizeDecay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How quickly each particle of the Cannon shot decays in size.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = alphaDecay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How quickly each particle of the Cannon shot fades out.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = separation&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The distance between each particle of the Cannon shot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noGap&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Switch between the distance between particles being proportional to the size of the two particles (&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;) or proportional to the size of the first particle (&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stages&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 5&lt;br /&gt;
|description = The number of particles in each Cannon shot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===DGun===&lt;br /&gt;
Fires a line-of-sight or ballistic projectile (selected via the {{taglink|gravityAffected}} tag). Visually represented by a fireball effect that cannot be customised, however it can be replaced by a 3D model. The name and visual effect are [[OTAism]]s.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = gravityAffected&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the fireball projectile lose height due to map gravity?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===EmgCannon===&lt;br /&gt;
A line-of-sight weapon. Visually drawn as a billboarded sprite very similar to that of the [[#Cannon]], however not as customisable, or a 3D model. The name is another [[OTAism]].&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Flame===&lt;br /&gt;
A line-of-sight weapon intended for use as a flamethrower or similar. Visually drawn as a stream of textured particles, the colour of which can be controlled very precisely using the {{taglink|colorMap}} tag (see [[CColorMap]]).&lt;br /&gt;
&lt;br /&gt;
====Flame Visuals====&lt;br /&gt;
See also {{taglink|colorMap}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sizeGrowth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|description = How much the draw radius of the flame projectile increases each frame.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flameGFXTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.2&lt;br /&gt;
|description = Makes the flamethrower projectile stay alive as a visual-only effect (i.e. does not deal any damage) after it has reached maximum {{taglink|range}}. It is a percentage multiplier, e.g. &amp;lt;code&amp;gt;1.2&amp;lt;/code&amp;gt; makes the projectile stay alive until it reaches 20% beyond {{taglink|range}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===LaserCannon===&lt;br /&gt;
A particularly versatile line-of-sight weapon. Visually drawn like a [http://en.wikipedia.org/wiki/Star_Wars Star Wars] Blaster-style laser weapon, or a 3D model.&lt;br /&gt;
&lt;br /&gt;
====LaserCannon Visuals====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = duration&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.05&lt;br /&gt;
|description = Multiplied against {{taglink|weaponVelocity}} to determine the visual length of the beam projectile.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = hardStop&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the laser projectile stop dead or fade out?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fallOffRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|description = Rate at which the beam fades out after it goes past its maximum {{taglink|range}} if {{taglink|hardStop|false}}. A value of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; is never fade out, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; is finish fading out exactly at maximum {{taglink|range}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = lodDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1000&lt;br /&gt;
|description = Minimum camera distance at which the default LaserCannon projectile is simplified to a single rectangle.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = thickness&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 2.0&lt;br /&gt;
|description = The thickness (width) of the LaserCannon projectile. Also for [[#BeamLaser Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = coreThickness&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 2.0&lt;br /&gt;
|description = The thickness (width) of the LaserCannon projectile&#039;s core. Also for [[#BeamLaser Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = rgbColor2&lt;br /&gt;
|type = float&lt;br /&gt;
|default = {1.0, 1.0, 1.0}&lt;br /&gt;
|description = The colour of the LaserCannon projectile&#039;s core. Also for [[#BeamLaser Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===LightningCannon===&lt;br /&gt;
An instant-hit weapon similar to the [[#BeamLaser]], but which does all its damage at once. Visually drawn like [http://en.wikipedia.org/wiki/Star_Wars Star Wars] &#039;Force Lightning&#039; or [http://en.wikipedia.org/wiki/Command_%26_Conquer:_Red_Alert CnC: Red Alert] [http://en.wikipedia.org/wiki/Tesla_coil Tesla Coil] weapons, the effect is not very customisable.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Melee===&lt;br /&gt;
A weapon that always damages the target, no ifs or buts; unsurprisingly intended for use as a close quarters [http://en.wikipedia.org/wiki/Melee#Use_in_gaming &#039;melee&#039;] weapon. It does not fire a projectile and does not care about the line of fire.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===MissileLauncher===&lt;br /&gt;
A versatile weapon which can optionally track targets and accelerate from a low initial velocity.  It can also use {{taglink|trajectoryHeight}} to have the shot arc similar to a ballistic  projectile. Visually represented by a 3D model, with an optional {{taglink|smokeTrail}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = startVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The initial velocity of the weapon projectile. Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = acceleration&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The initial acceleration of the weapon projectile. Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]]. Note that if it is &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; the weapon can never increase from its {{taglink|startVelocity}} and will not reach its maximum {{taglink|weaponVelocity}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tracks&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the weapon projectile track a moving target? Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]].}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The rate (in [[Elmo#Angular|cau]]) at which {{taglink|tracks|true}} weapons turn towards their target. This is relative to a projectile&#039;s current velocity; a weapon with a higher velocity will need a higher value in order to be able to hit targets that turn suddenly.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flightTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The time in seconds before a missile projectile&#039;s fuel runs out; it ceases to obey {{taglink|tracks}}, loses velocity and falls to the ground. Also for [[#StarburstLauncher]]. Large values may cause over/undershoot problems.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fixedLauncher&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Makes the projectile spawn with the orientation of the shooting piece instead of their normal orientation. Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]]. Weapons may not correctly obey [[#Collision &amp;amp; Avoidance|avoidance settings]] when using this tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = wobble&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Adds a random vector to the direction of travel every 16 frames, multiplied by the value of the tag. The effect is reduced as the firing unit gains experience. As this missiles direction is changed, wobbling swarm of missiles will diverge.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Adds a random vector to the position of a missile projectile every 8 frames, multiplied by the value of the tag. As the projectile is not rotated, a dancing swarm of missiles will remain relatively coherent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trajectoryHeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Determines the height of the arc the missile will reach as it moves towards its target. A value of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; will result in a flat trajectory, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; will launch at 45&amp;amp;deg;. Can be any value &amp;gt;= &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;; extreme values may require the {{taglink|tracks}} tag to be able to hit a target.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====MissileLauncher Visuals====&lt;br /&gt;
A note about the missile exhaust flare: the size of the flare is determined by the model radius. The emit position of the flare is at (0,0,-radius) so the model may need careful adjustment to get the flare looking right.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = smokeTrail&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the missile projectile emit a smoke trail as it travels? Also for [[#StarburstLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Rifle===&lt;br /&gt;
An instant hit weapon which does all its damage at once. Visually represented by a hardcoded tracer, firing and hitting effects. Rarely used.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Shield (WeaponType)===&lt;br /&gt;
As the name suggests, not a weapon but a defensive shield. Can absorb or deflect ({{taglink|repulsor|true}}) projectiles. Individual weapons can be set to be intercepted or not by the shield using a [http://en.wikipedia.org/wiki/Mask_(computing) bitmask] (see [[Shield Interception Tag Use]]). Visually represented as a translucent sphere, with control over colour and texture; by default the shield is invisible ({{taglink|visible|false}}).&lt;br /&gt;
&lt;br /&gt;
See the [[#shield]] sub-table section for other tags specific to this type.&lt;br /&gt;
&lt;br /&gt;
===StarburstLauncher===&lt;br /&gt;
Fires a projectile that rises vertically for {{taglink|weaponTimer}} seconds, then turns towards its target. It can optionally track targets and accelerate from a low initial velocity. This is the only weapon that can be {{taglink|targetable}} and act as an {{taglink|interceptor}}. Visually represented by a 3D model, with an optional {{taglink|smokeTrail}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = weaponTimer&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The time in seconds during which the missile ascends vertically before turning towards its target.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===TorpedoLauncher===&lt;br /&gt;
Fires a projectile that will behave ballistically out of water and like a missile in water. Usually used with {{taglink|waterWeapon|true}} so they can fire underwater and target underwater units. An aircraft carrying a [[#TorpedoLauncher]] is a special case, the weapon turns into an [[#AircraftBomb]] projectile that will spawn a torpedo projectile on impact with water. Visually represented by a pointed black cuboid, usually the default object is replaced by a 3D model. &lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = subMissile&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the torpedo leave the water and target units and positions on land?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===NoWeapon===&lt;br /&gt;
Not actually a &#039;&#039;&#039;WeaponType&#039;&#039;&#039;, but an individual weapon requested by Spring to &#039;fill in the gaps&#039; if a unit claims to have a weapon which isn&#039;t actually defined. There needs to be only one of these weapons and it is created by setting {{taglink|weaponName|&amp;quot;NOWEAPON&amp;quot;}} rather than by the {{taglink|weaponType}} tag.&lt;br /&gt;
&lt;br /&gt;
==Sub Tables==&lt;br /&gt;
&lt;br /&gt;
===damage===&lt;br /&gt;
The damage subtable lists how many hit points the weapon depletes against each armor class (See [[Armordefs.lua]]). It is a key-value map of armor class names and damage values. The special &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; entry is as the name suggests the default damage applied to any unit which does not belong to a listed armor class, or to shields.&lt;br /&gt;
&lt;br /&gt;
For example a weapon which deals 100 damage by default but only 50 to units in the &#039;tank&#039; armor class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;damage = {&lt;br /&gt;
    default = 100,&lt;br /&gt;
    tank = 50,&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===shield===&lt;br /&gt;
The preferred way to create a shield or repulsor is to use the shield subtable rather than the old shield tags. &lt;br /&gt;
&lt;br /&gt;
The following tags are repulsor specific:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = repulsor&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the shield [http://dictionary.reference.com/browse/repulse?s=t repulse] (deflect) projectiles or absorb them?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = force&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The force applied by the repulsor to the weapon - higher values will deflect weapons away at higher velocities.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The maximum speed the repulsor will impart to deflected projectiles.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = visibleRepulse&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the (hard-coded) repulse effect rendered or not?}}&lt;br /&gt;
&lt;br /&gt;
The following tags are general behaviour for all shields:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptType&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of weapons that this shield can intercept. Each digit of binary that is set to one means that a weapon with the corresponding digit in its {{taglink|interceptedByShieldType}} will be intercepted by this shield (See [[Shield Interception Tag Use]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = smart&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines whether or not projectiles fired by allied units can pass through the shield (&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;) or are intercepted as enemy weapons are (&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = exterior&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines whether or not projectiles fired within the shield&#039;s radius can pass through the shield (&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;) or are intercepted (&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyUse&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource consumed by the shield to absorb or repulse weapons, continually drained by a repulsor as long as the projectile is in range.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radius&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The radius of the circular area the shield covers.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = power&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Essentially the maximum allowed hit-points of the shield - reduced by the &amp;lt;code&amp;gt;damage&amp;lt;/code&amp;gt; of a weapon upon impact.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = startingPower&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How many hit-points the shield starts with - otherwise the shield must regenerate from &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; until it reaches maximum {{taglink|power}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = powerRegen&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How many hit-points the shield regenerates each second.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = powerRegenEnergy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How much energy resource is consumed to regenerate each hit-point.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = rechargeDelay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The delay in seconds before a shield begins to regenerate after it is hit.}}&lt;br /&gt;
&lt;br /&gt;
The following tags control the visual aspects of the shield:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = visible&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the shield visible or not?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = visibleHitFrames&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The number of frames a shield becomes visible for when hit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = badColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {1.0, 0.5, 0.5} (Red)&lt;br /&gt;
|description = The RGB colour the shield transitions to as its hit-points are reduced towards &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = goodColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.5, 0.5, 1.0} (Blue)&lt;br /&gt;
|description = The RGB colour the shield transitions to as its hit-points are regenerated towards its maximum {{taglink|power}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = alpha&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.2&lt;br /&gt;
|description = The alpha transparency of the shield whilst it is visible.}}&lt;br /&gt;
&lt;br /&gt;
===customParams===&lt;br /&gt;
The &amp;lt;code&amp;gt;customParams&amp;lt;/code&amp;gt; subtable of a WeaponDef allows the game designer to give their weapons custom attributes, which can then be accessed via lua gadgets and widgets. It is a map (key-value pair indexed table) of strings. When accessing these attributes in lua the strings can be turned back into numbers, bools or even tables. This gives great control to game designers to essentially implement their own behaviour tags.&lt;br /&gt;
&lt;br /&gt;
There are no additional tags specific to this subtable&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[http://imolarpg.dyndns.org/trac/balatest/browser/trunk/weapons &#039;Balanced Annihilation&#039; WeaponDefs]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/conflictterra/source/browse/#svn%2Fgames%2FCT%2Fweapons &#039;Conflict Terra&#039; WeaponDefs] (Most are integrated into their [[Units-UnitDefs#Examples|UnitDefs]])&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/evolutionrts/source/browse/#svn%2Ftrunk%2Fevolutiondev.sdd%2FWeapons &#039;Evolution RTS&#039; WeaponDefs] (Most are integrated into their [[Units-UnitDefs#Examples|UnitDefs]])&lt;br /&gt;
&lt;br /&gt;
[http://spring1944.svn.sourceforge.net/viewvc/spring1944/trunk/S44Main.sdd/weapons/ &#039;Spring: 1944&#039; WeaponDefs] (Implements an [http://en.wikipedia.org/wiki/Object-oriented_programming OOP] paradigm with [http://en.wikipedia.org/wiki/Inheritance_(computer_science) inheritance])&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/springtutorialgame/source/browse/#svn%2Ftrunk%2FSpringTutorialGame.sdd%2FWeapons &#039;Spring Tutorial Game&#039; WeaponDefs]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Units]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:UnitDefs&amp;diff=8543</id>
		<title>Gamedev:UnitDefs</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:UnitDefs&amp;diff=8543"/>
		<updated>2013-09-11T05:46:51Z</updated>

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

		<summary type="html">&lt;p&gt;Kingraptor: /* Spring to Ren&amp;#039;Py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Ren&#039;Py&#039;&#039;&#039; is an open source visual novel engine, available [http://www.renpy.org/ here]. It can be used in conjunction with Spring to provide a singleplayer experience with narrative, dialogue, images and videos.&lt;br /&gt;
&lt;br /&gt;
== Using Ren&#039;Py with Spring ==&lt;br /&gt;
Without the use of sockets, Ren&#039;Py and Spring can best communicate in the following way:&lt;br /&gt;
&lt;br /&gt;
=== Ren&#039;Py to Spring ===&lt;br /&gt;
Python can read a Spring startscript and modify it, say using [http://docs.python.org/2/library/string.html#formatstrings str.format] or the older [http://docs.python.org/2/library/stdtypes.html#string-formatting % (modulo) operator]. In this way, any arbitrary game, per-player or per-team information can be made available to Spring at runtime. It is also theoretically possible for Python to modify the contents of an .sdz or .sdd archive directly, but this is not recommended.&lt;br /&gt;
&lt;br /&gt;
=== Spring to Ren&#039;Py ===&lt;br /&gt;
A widget or gadget can write a Python file with any information to be communicated to Ren&#039;Py, which it can then import using the [http://docs.python.org/2/library/functions.html#execfile execfile] function. Bear in mind that because Spring is limited in which directories its Lua can write files to, Ren&#039;Py will need to know where the Spring datadir is.&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
[https://code.google.com/p/springpy/ SpringPy] is a code example for Spring-Ren&#039;Py communication. You can check out the whole repo and open/run the Ren&#039;Py project with the Ren&#039;Py SDK.&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/game/script.rpy Example script.rpy]&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/spring/script_pytest.txt Example startscript]&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/spring/LuaUI/Widgets/api_shared_functions.lua Widget to write Python dictionaries and module files]&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/spring/LuaUI/Widgets/dbg_test.lua Test widget]: writes data required by sample code on widget:Initialize()&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Dev]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11017</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=11017"/>
		<updated>2013-08-25T17:32:02Z</updated>

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

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

		<summary type="html">&lt;p&gt;Kingraptor: /* Known Repos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What Is This?==&lt;br /&gt;
This is a small collection of publicly known and readable code repositories for established Spring games. The intention being to provide a wealth of examples to all game developers from noob to pro.&lt;br /&gt;
&lt;br /&gt;
== Known Repos ==&lt;br /&gt;
[https://code.google.com/p/air-raid-spring/ Air Raid]&lt;br /&gt;
&lt;br /&gt;
[http://imolarpg.dyndns.org/trac/balatest/browser/trunk/ Balanced Annihilation]&lt;br /&gt;
&lt;br /&gt;
[https://sourceforge.net/p/mwspring/code/ BattleTech: Legacy]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/conflictterra/source/browse/#svn%2Fgames%2FCT Conflict Terra]&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/evolutionrts/source/browse/#svn%2Ftrunk%2Fevolutiondev.sdd Evolution RTS]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/imperialwinter/swiw.sdd Imperial Winter]&lt;br /&gt;
&lt;br /&gt;
[https://sourceforge.net/p/spring1944/code/HEAD/tree/trunk/S44Main.sdd/ Spring: 1944]&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/springtanks/source/browse/#svn%2Ftrunk Spring Tanks]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/springtutorialgame/source/browse/#svn%2Ftrunk%2FSpringTutorialGame.sdd Spring Tutorial Game]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KingRaptor/THIS THIS]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/zero-k/source/browse/trunk#trunk%2Fmods%2Fzk Zero-K]&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Dev]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:PublicRepos&amp;diff=8333</id>
		<title>Gamedev:PublicRepos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:PublicRepos&amp;diff=8333"/>
		<updated>2013-08-19T17:01:49Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* Known Repos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What Is This?==&lt;br /&gt;
This is a small collection of publicly known and readable code repositories for established Spring games. The intention being to provide a wealth of examples to all game developers from noob to pro.&lt;br /&gt;
&lt;br /&gt;
== Known Repos ==&lt;br /&gt;
[https://code.google.com/p/air-raid-spring/ &#039;Air Raid&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[http://imolarpg.dyndns.org/trac/balatest/browser/trunk/ &#039;Balanced Annihilation&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[https://sourceforge.net/p/mwspring/code/ &#039;BattleTech: Legacy&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[http://trac.caspring.org/browser/trunk/mods/ca/ &#039;Complete Annihilation&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/conflictterra/source/browse/#svn%2Fgames%2FCT &#039;Conflict Terra&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/evolutionrts/source/browse/#svn%2Ftrunk%2Fevolutiondev.sdd &#039;Evolution RTS&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/imperialwinter/swiw.sdd &#039;Imperial Winter&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[https://sourceforge.net/p/spring1944/code/HEAD/tree/trunk/S44Main.sdd/ &#039;Spring: 1944&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/springtutorialgame/source/browse/#svn%2Ftrunk%2FSpringTutorialGame.sdd &#039;Spring Tutorial Game&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/zero-k/source/browse/trunk#trunk%2Fmods%2Fzk &#039;ZeroK&#039; Repo]&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Dev]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:WeaponDefs&amp;diff=8767</id>
		<title>Gamedev:WeaponDefs</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:WeaponDefs&amp;diff=8767"/>
		<updated>2013-08-18T13:10:13Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* damage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Location==&lt;br /&gt;
WeaponDef files are .lua files stored in the &amp;lt;code&amp;gt;Weapons/&amp;lt;/code&amp;gt; directory of a Spring Game. Alternatively they can be integrated into [[Units-UnitDefs|UnitDefs]].&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
WeaponDef files have one purpose; to define the properties of weapons. They are the main description file for what attributes your weapon should have and how it should behave.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which loads the tags from these files is viewable here:&lt;br /&gt;
&lt;br /&gt;
* {{sourcelink|file=rts/Sim/Weapons/WeaponDef.cpp}}&lt;br /&gt;
&lt;br /&gt;
==Data Types==&lt;br /&gt;
Tags may be one of the following data types:&lt;br /&gt;
* &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; - An integer number&lt;br /&gt;
* &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; - A number with decimals.&lt;br /&gt;
* &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; - A value which can be &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; - Text, or more precisely a string of alphanumeric characters.&lt;br /&gt;
* &amp;lt;code&amp;gt;float[3]&amp;lt;/code&amp;gt; - A vector, with three &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; components, representing x, y and z axes (y is &#039;up&#039;).&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
There follows a comprehensive (certain deprecated tags are not present) list of the tags available, their data type, default value and a brief description of what they do. Bear in mind that the source code linked above is the ultimate reference when dealing with these tags. &lt;br /&gt;
&lt;br /&gt;
In lua tables keys (i.e. the tags) should be lower case, here they are represented in camelCase for readability. In your files you may use the &amp;lt;code&amp;gt;lowerkeys&amp;lt;/code&amp;gt; function on your final table to ensure the keys are properly cased.&lt;br /&gt;
&lt;br /&gt;
It is usual to name the returned WeaponDef table the internal &amp;lt;code&amp;gt;weaponName&amp;lt;/code&amp;gt; desired for the weapon.&lt;br /&gt;
&lt;br /&gt;
===Common===&lt;br /&gt;
The following tags are common to all or at least a majority of &#039;&#039;&#039;WeaponTypes&#039;&#039;&#039;, depending on the tag.&lt;br /&gt;
&lt;br /&gt;
====General====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = weaponType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;Cannon&amp;quot;&lt;br /&gt;
|description = Spring has 14 &#039;&#039;&#039;WeaponTypes&#039;&#039;&#039; which provide game developers with basic behaviours which they can customise to an extent with the &#039;&#039;&#039;WeaponDef&#039;&#039;&#039; tags. Some tags are specific to certain &#039;&#039;&#039;WeaponTypes&#039;&#039;&#039; and not implemented for others, [https://docs.google.com/spreadsheet/ccc?key=0Am5BbZxm93S9dEZXc1Q4dXR4TFRYTFM4NlR4OFJFdWc#gid=0 this two-way table] indicates which tags work for which types.}} The possible values are:&lt;br /&gt;
* [[#AircraftBomb|AircraftBomb]]&lt;br /&gt;
* [[#BeamLaser|BeamLaser]]&lt;br /&gt;
* [[#Cannon|Cannon]]&lt;br /&gt;
* [[#DGun|Dgun]]&lt;br /&gt;
* [[#EmgCannon|EmgCannon]]&lt;br /&gt;
* [[#Flame|Flame]]&lt;br /&gt;
* [[#LaserCannon|LaserCannon]]&lt;br /&gt;
* [[#LightningCannon|LightningCanon]]&lt;br /&gt;
* [[#Melee|Melee]]&lt;br /&gt;
* [[#MissileLauncher|MissileLauncher]]&lt;br /&gt;
* [[#Rifle|Rifle]]&lt;br /&gt;
* [[#Shield (WeaponType)|Shield]]&lt;br /&gt;
* [[#StarburstLauncher|StarburstLauncher]]&lt;br /&gt;
* [[#TorpedoLauncher|TorpedoLauncher]]&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = name&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;Weapon&amp;quot;&lt;br /&gt;
|description = The descriptive name of the weapon as listed in FPS mode.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turret&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit aim within an arc (up-to and including full 360Â° turret traverse) or always aim along the owner&#039;s heading?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noSelfDamage&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the weapon&#039;s explosion damage the unit which fires it? Useful for preventing bombers with high-yield weapons destroying themselves.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = impactOnly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon only deal damage through direct hits and not &#039;splash&#039; damage through {{taglink|areaOfEffect}}?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noExplode&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon explode on impact with a target or continue through? Note that these weapons will do damage every single frame they are inside the [[Unit_collision_volumes|collision volume]] of an object, underground or under water, massively multiplying their damage.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = burnblow&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon explode when it reaches its maximum range or continue on its path? The name is an [[OTAism]].}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = range&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 10.0&lt;br /&gt;
|description = The maximum range in [[elmo]]s that the weapon can fire at.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = weaponVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The velocity in [[elmo]]s per second of the weapon projectile.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = reloadTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The time in seconds between shots fired.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalPerShot&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Metal used per shot. If the specified amount is not available, the weapon cannot be fired. Can also be used to specify how much a {{taglink|stockpile}} weapon will cost to build.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyPerShot&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Energy used per shot. If the specified amount is not available, the weapon cannot be fired. Can also be used to specify how much a {{taglink|stockpile}} weapon will cost to build.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = myGravity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Overrides the map gravity for ballistic weapons. The default of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; disables the tag in favour of map gravity.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fireStarter&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The percentage chance (&amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;100.0&amp;lt;/code&amp;gt;) of the weapon setting fire to static map features on impact.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cameraShake&lt;br /&gt;
|type = float&lt;br /&gt;
|default = damage (0.0 for paralyzers)&lt;br /&gt;
|description = Passed to the [[LuaCallinReturn#Game_Events:|ShockFront() callin]] as the first argument. Intended as a means to make the camera shake if in range of detonation.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stockpile&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does each round of the weapon have to be built and stockpiled by the player? Will only correctly function for the first of each stockpiled weapons a unit has.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stockpileTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = reloadTime&lt;br /&gt;
|description = The time in seconds taken to stockpile one round of the weapon.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptedByShieldType&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0 (See description)&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of shields that can intercept this weapon. Each digit of binary that is set to one means that a shield with the corresponding digit in its {{taglink|interceptType}} will intercept this weapon. The defaults are as follows:&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - [[#Cannon]] and [[#EmgCannon]]&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - [[#LaserCannon]] and [[#BeamLaser]]&lt;br /&gt;
* &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; - [[#MissileLauncher]] and [[#StarburstLauncher]]&lt;br /&gt;
* &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; - [[#AircraftBomb]]&lt;br /&gt;
* &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; - [[#Flame]]&lt;br /&gt;
* &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; - [[#TorpedoLauncher]]&lt;br /&gt;
* &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; - [[#LightningCannon]]&lt;br /&gt;
* &amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt; - [[#Rifle]]&lt;br /&gt;
* &amp;lt;code&amp;gt;256&amp;lt;/code&amp;gt; - [[#Melee]]&lt;br /&gt;
(See [[Shield Interception Tag Use]]).}}&lt;br /&gt;
&lt;br /&gt;
====Collision &amp;amp; Avoidance====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Should the weapon avoid firing if terrain blocks the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidFriendly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Should the weapon avoid firing if a friendly unit is in the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidFeature&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Should the weapon avoid firing if a static map feature is in the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = avoidNeutral&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the weapon avoid firing if a neutral unit is in the line of fire?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideEnemy&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with enemy units or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideFriendly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with friendly units or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideFeature&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with static map features or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideNeutral&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with neutral units or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collideGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the weapon projectile collide with terrain or pass through?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionSize&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.05 (0.5 for [[#Flame]] and [[#LaserCannon]], 10.0 for [[#Dgun]])&lt;br /&gt;
|description = The radius used in collision calculations. For non-instant-hit weapons which do not use a 3D {{taglink|model}}.}}&lt;br /&gt;
&lt;br /&gt;
====Targeting &amp;amp; Accuracy====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = commandFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines if the weapon will automatically fire on enemy units in range or only when manually ordered to attack.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canAttackGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Determines if the weapon can be force-fired on ground positions or only fire on targeted units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = waterWeapon&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines if the weapon can pass through water and target underwater units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fireSubmersed&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = waterWeapon&lt;br /&gt;
|description = Determines if the weapon can fire whilst underwater.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = targetBorder&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (1.0 for [[#Melee]])&lt;br /&gt;
|description = Controls whether the weapon aims for the centre or the edge of its target&#039;s [[Unit_collision_volumes|collision volume]]. Clamped between &amp;lt;code&amp;gt;-1.0&amp;lt;/code&amp;gt; - target the far border, and &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; - target the near border.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cylinderTargeting&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (1.0 for [[#Melee]])&lt;br /&gt;
|description = Controls whether the weapon range is calculated in a sphere or a cylinder. The height of the cylinder is determined by the value of this tag multiplied by the {{taglink|range}}. Clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;128.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tolerance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 3000.0&lt;br /&gt;
|description = The amount to which the weapon&#039;s &amp;quot;real&amp;quot; aim can be off while the weapon will still be able to fire accurately at the target. For {{taglink|turret|false}} or {{taglink|fixedlauncher|true}} weapons this determines in what arc the unit will fire.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = targetMoveError&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The degree to which a weapon&#039;s aiming will fail to keep up with its target&#039;s movement. If set very low or not set at all, a weapon will lead its target and almost always hit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = leadLimit&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -1.0&lt;br /&gt;
|description = Limits the maximum distance a unit will lead a target. The default of &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; allows an infinite distance.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = leadBonus&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Controls how experience boosts the weapon&#039;s target leading. Is multiplied with the unit&#039;s experience and added to the {{taglink|leadLimit}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = predictBoost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (0.5 for {{taglink|burnblow|true}} weapons)&lt;br /&gt;
|description = Controls how well the weapon predicts unit speeds. Works in a similar way to  {{taglink|targetMoveError}} except that it is 1-dimensional. This tag spreads the shots in a line based on the direction of the target whereas {{taglink|targetMoveError}} spreads the shots all around based on the movement.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = heightMod&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.2 (0.8 for [[#Cannon]], 1.0 for [[#BeamLaser]] and [[#LightningCannon]])&lt;br /&gt;
|description = Changes the spherical weapon range into an ellipsoid. Values above &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; mean the weapon cannot target as high as it can far, values below &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; mean it can target higher than it can far. For example &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt; would allow the weapon to target twice as high as far.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = proximityPriority&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = Acts as a multiplier for the distance to the target in the priority calculation. Note that negative values make weapons prefer distant targets.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = accuracy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How accurate the weapon is. Lower values are more accurate. Accuracy is relative to the distance to the target; for instance, if the target is very close, even a very high value will probably still hit. If a target is very far away, even a very low value will likely cause the weapon to miss.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = movingAccuracy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = accuracy&lt;br /&gt;
|description = A weapon&#039;s {{taglink|accuracy}} whilst the owning unit is moving.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sprayAngle&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How wide the the angle of a burst from a [[#Bursts|burst weapon]] can be. Very similar to {{taglink|accuracy}}, except that this tag affects each projectile in a burst, whilst the former does not.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = ownerExpAccWeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0 (See description)&lt;br /&gt;
|description = A multiplier to {{taglink|accuracy}} and {{taglink|sprayAngle}} that reduces inaccuracy as a units experience increases. Defaults are as follows:&lt;br /&gt;
* &amp;lt;code&amp;gt;0.9&amp;lt;/code&amp;gt; - [[#Cannon]], [[#Rifle]]&lt;br /&gt;
* &amp;lt;code&amp;gt;0.7&amp;lt;/code&amp;gt; - [[#LaserCannon]], [[#BeamLaser]], [[#StarburstLauncher]]&lt;br /&gt;
* &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt; - [[#MissileLauncher]], [[#LightningCannon]], [[#EmgCannon]], [[#DGun]]&lt;br /&gt;
* &amp;lt;code&amp;gt;0.2&amp;lt;/code&amp;gt; - [[#Flame]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = targetable&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|special = {{new|92.0}} Previously only for [[#StarburstLauncher]]&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of weapon that can intercept this weapon. Each digit of binary that is set to one means that a weapon with the corresponding digit in its {{taglink|interceptor}} tag will intercept this weapon. Instant-hitting weapons such as [[#BeamLaser]], [[#LightningCannon]] and [[#Rifle]] cannot be targeted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptor&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|special = {{new|92.0}} Previously only for [[#StarburstLauncher]]&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of weapons that this weapon can intercept. Each digit of binary that is set to one means that a weapon with the corresponding digit in its {{taglink|targetable}} tag will be intercepted by this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptSolo&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|special = {{new|92.0}} &lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; no other interceptors may target the same projectile.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = coverage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = {{new|92.0}} Previously only for [[#StarburstLauncher]]&lt;br /&gt;
|description = The radius in [[elmo]]s within which an {{taglink|interceptor}} weapon will fire on {{taglink|targetable}} weapons.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Bouncing====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = waterBounce&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon bounce on water impacts?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = groundBounce&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon bounce on ground impacts?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bounceSlip&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The decimal-percentage amount of horizontal velocity a projectile keeps when it bounces.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bounceRebound&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The decimal-percentage amount of vertical velocity a projectile keeps when it bounces.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = numBounce&lt;br /&gt;
|type = int&lt;br /&gt;
|default = -1&lt;br /&gt;
|description = The number of times the weapon will bounce on impact before exploding. The default value of &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; allows infinite bounces (at least until velocity reaches 0).}}&lt;br /&gt;
&lt;br /&gt;
====Area Of Effect, Impulse &amp;amp; Cratering====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = areaOfEffect&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 8.0 * 0.5&lt;br /&gt;
|description = The &#039;&#039;diameter&#039;&#039; in [[elmo]]s in which the weapons explosion will cause damage.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = craterAreaOfEffect&lt;br /&gt;
|type = float&lt;br /&gt;
|default = areaOfEffect * 0.5&lt;br /&gt;
|description = The &#039;&#039;radius&#039;&#039; in [[elmo]]s in which the weapons explosion will cause terrain cratering.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = edgeEffectiveness&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Determines what percent of a weapon&#039;s maximum damage value will be applied to units within the weapon&#039;s {{taglink|areaOfEffect}}. Falls off from the epicentre according to the formula &amp;lt;code&amp;gt;damageApplied = damage * [(areaOfEffect - distToUnit) / (areaOfEffect - (distToUnit * edgeEffectiveness))]&amp;lt;/code&amp;gt;, a graph of the function for various values is available [[Media:EdgeEffectiveness.png|here]].}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explosionSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = See description&lt;br /&gt;
|description = The speed at which the weapon&#039;s explosion propagates from the epicentre. The default is calculated by this complex formula: &amp;lt;code&amp;gt;defExpSpeed = {8.0 + [max(30.0, default_damage / 20.0) * 2.5]} / {9.0f + [sqrt(max(30.0, default_damage / 20.0f)) * 0.7]} * 0.5&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = impulseFactor&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = A multiplier to the impulse given to units within the explosion {{taglink|areaOfEffect}}, which is otherwise equal to the damage dealt after {{taglink|edgeEffectiveness}} is taken into account. For [[#Melee]] weapons this is instead multiplied by the owning unit&#039;s mass (See [[Units-UnitDefs#Tag:mass|Units-UnitDefs]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = impulseBoost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = A constant amount added to the weapon&#039;s impulse, regardless of distance from the epicentre or the damage potential of the explosion, prior to the application of {{taglink|impulseFactor}}}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = craterMult&lt;br /&gt;
|type = float&lt;br /&gt;
|default = impulseFactor&lt;br /&gt;
|description = A multiplier to depth of terrain crater the weapon&#039;s explosion will create, which is otherwise based on the damage potential.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = craterBoost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = A constant amount, added to the weapon&#039;s cratering depth before the application of {{taglink|craterMult}}.}}&lt;br /&gt;
&lt;br /&gt;
====Bursts====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = burst&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = How many shots to fire per burst.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = burstRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.1&lt;br /&gt;
|description = The time in seconds between shots in a burst. Note that {{taglink|reloadTime}} starts to count down from the &#039;&#039;first&#039;&#039; round fired, not the last so if &amp;lt;code&amp;gt;reloadTime &amp;lt; burst * burstRate&amp;lt;/code&amp;gt; the weapon will fire continuously.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = projectiles&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = How many projectiles released per shot (shotgun style). e.g. a weapon with {{taglink|burst|5}}, {{taglink|burstRate|0.5}} and {{taglink|projectiles|2}} will shoot 5 lots of 2 for 10 projectiles total, with gaps of 0.5 seconds, before waiting for {{taglink|reloadTime}}. Best used in conjunction with {{taglink|sprayAngle}} or changing the firing piece using [[Animation-LuaCallins#Weapons|ShotX]] as otherwise they&#039;ll all be clumped in one shot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Paralyzing====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = paralyzer&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the weapon a paralyzer? If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the weapon only stuns enemy units and does not cause damage in the form of lost hit-points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = paralyzeTime&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 10&lt;br /&gt;
|description = Determines the maximum length of time in seconds that the target will be paralyzed. The timer is restarted every time the target is hit by the weapon. Cannot be less than &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Dynamic Damage====&lt;br /&gt;
The following set of tags allow for a weapon&#039;s damage potential to vary with the distance to its target.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageExp&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Exponent of the range-dependent damage formula, the default of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; disables dynamic damage, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means linear scaling, &amp;lt;code&amp;gt;2.0&amp;lt;/code&amp;gt; quadratic and so on.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageMin&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum floor value that range-dependent damage can drop to.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageRange&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = If set to non-zero values the weapon will use this value in the range-dependant damage formula instead of the actual {{taglink|range}}. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dynDamageInverted&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the damage curve is inverted i.e. the weapon does more damage at greater ranges as opposed to less.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Sounds====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundTrigger&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false (true for [[#Melee]], [[#Rifle]] and non-beamBurst [[#BeamLaser]])&lt;br /&gt;
|description = Does the weapon play {{taglink|soundStart}} for every round in a burst or only once for each salvo?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundStart&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a &#039;&#039;&#039;SoundItem&#039;&#039;&#039; (See [[Sounds.lua]]) or filename of a sound to play when the weapon fires.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundHitDry&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a &#039;&#039;&#039;SoundItem&#039;&#039;&#039; (See [[Sounds.lua]]) or filename of a sound to play when the weapon collides with solid ground. Note that a [[#BeamLaser]] will play this sound every frame of its lifetime.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = soundHitWet&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a &#039;&#039;&#039;SoundItem&#039;&#039;&#039; (See [[Sounds.lua]]) or filename of a sound to play when the weapon collides with water. Note that a [[#BeamLaser]] will play this sound every frame of its lifetime.}}&lt;br /&gt;
&lt;br /&gt;
====Visuals====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cegTag&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name, without prefixes, of a [[CEG]] to be emitted by the projectile each frame.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = intensity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.9 (0.2 for [[#Cannon]])&lt;br /&gt;
|description = Alpha transparency for non-3D model projectiles. Lower values are more opaque, but &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; will cause the projectile to disappear entirely.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = model&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The filename of a 3D model to use when rendering the projectile. Note that only the root piece of a projectile model is rendered. Currently only for [[#Cannon]], [[#LaserCannon]], [[#MissileLauncher]], [[#StarburstLauncher]] and [[#TorpedoLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explosionScar&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the weapon&#039;s explosion leave a scar decal on the ground? For all types except [[#Melee]] and [[#Rifle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = alwaysVisible&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the weapon is always rendered regardless of whether or not it is in LOS range of a player&#039;s units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = rgbColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {1.0, 0.0, 0.0} (See Description)&lt;br /&gt;
|description = The primary colour for sprite rendering weapons. Additional defaults are as follows:&lt;br /&gt;
* [[#Cannon]] - &amp;lt;code&amp;gt;{1.0, 0.5, 0.0}&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[#EmgCannon]] - &amp;lt;code&amp;gt;{0.9, 0.9, 0.2}&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explosionGenerator&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of a [[CEG]], with &amp;lt;code&amp;gt;custom:&amp;lt;/code&amp;gt; prefix, to spawn as the weapon&#039;s explosion. Does not currently work for [[#Melee]] and [[#Rifle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bounceExplosionGenerator&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = For weapons which can use {{taglink|groundBounce|true}}, the name of a [[CEG]], with &amp;lt;code&amp;gt;custom:&amp;lt;/code&amp;gt; prefix, to spawn when weapon the bounces.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture1&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The projectile texture for [[#AircraftBomb]], [[#Cannon]], [[#EmgCannon]], [[#Flame]]; beam texture for [[#LaserCannon]], [[#BeamLaser]], [[#LightningCannon]]; flare texture for [[#MissileLauncher]], [[#StarburstLauncher]] and dome texture for the [[#Shield]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture2&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The end-of-beam texture for [[#LaserCannon]], [[#BeamLaser]] and {{taglink|smoketrail}} texture for [[#MissileLauncher]], [[#StarburstLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture3&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = Flare texture for [[#BeamLaser]], or muzzle texture if {{taglink|largeBeamLaser|true}}. Also used as the flame texture for [[#StarburstLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = texture4&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = Flare texture for [[#BeamLaser]] with {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===AircraftBomb===&lt;br /&gt;
Drops a ballistic projectile at the same movement vector as the unit itself. Intended only for aircraft. Visually drawn as a billboarded sprite as used by the [[#Cannon]], but more commonly used with a 3D model.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====AircraftBomb Visuals====&lt;br /&gt;
&lt;br /&gt;
When not using a {{taglink|model}}, the AircraftBomb is the same as [[#Cannon Visuals]].&lt;br /&gt;
&lt;br /&gt;
===BeamLaser===&lt;br /&gt;
An instant-hit weapon which spawns a beam and does a portion of its total damage each frame. Cannot be [[Animation-LuaCallouts#Effects|script emitted]] if it has a {{taglink|beamTime}} longer than one frame. Visually drawn as a [http://en.wikipedia.org/wiki/Star_Trek Star Trek] Phaser-style laser weapon. The {{taglink|largeBeamLaser}} tag allows changing the visual effect of the laser, such as using a tileable, scrolling texture without changing the behaviour.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minIntensity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum percentage the weapon&#039;s damage can fall-off to over its range. Setting to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; will disable fall off entirely. Unrelated to the visual-only {{taglink|intensity}} tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How long in seconds to fire the laser before waiting for {{taglink|reloadTime}} to start. Damage is distributed over the duration of the {{taglink|beamTime}}, and the weapon will aim to hit the target when the beam is in the middle of its {{taglink|beamTime}} (i.e. using prediction).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamBurst&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Makes the laser fire a burst of beams that are all aimed towards the target (instead of aimed with the piece). A [[#BeamLaser]] can do its full damage with every shot if {{taglink|beamBurst}} is enabled. Disables {{taglink|beamTime}} in favour of the [[#Bursts|burst tags]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sweepFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Makes the laser continue firing while it aims for a new target, &#039;sweeping&#039; across the terrain. Somewhat unreliable.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====BeamLaser Visuals====&lt;br /&gt;
&lt;br /&gt;
See also {{taglink|thickness}} and {{taglink|coreThickness}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamTTL&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The time in frames for which the laser beam remains visible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = beamDecay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How fast the beam fades out. Each frame the {{taglink|intensity}} is multiplied by this value.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = laserFlareSize&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 15.0&lt;br /&gt;
|description = Determines the size of the firing flare.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = largeBeamLaser&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Changes the visual effect allowing tiling and scrolling of the texture and a pulsating firing flare.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tileLength&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 200.0&lt;br /&gt;
|description = Defines the length before the texture used is repeated (tiled). Only if {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = scrollSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 5.0&lt;br /&gt;
|description = Controls how fast the texture scrolls. Only if {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = pulseSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = Controls how fast the pulsating effect at the start of the beam is. Only if {{taglink|largeBeamLaser|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Cannon===&lt;br /&gt;
The default &#039;&#039;&#039;WeaponType&#039;&#039;&#039;. Fires a ballistic projectile, for the best result (without under/overshooting) the {{taglink|weaponVelocity}} should be set so as to give an elevation of 45Â° when firing at the maximum {{taglink|range}}. Substituting the angle into the [http://en.wikipedia.org/wiki/Trajectory#Range_and_height trajectory equation] and rearranging, we get: &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;weaponVelocity = âˆš(range * g)&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
where &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; is the map gravity, usually around &amp;lt;code&amp;gt;120&amp;lt;/code&amp;gt; for most Spring maps (You can use the {{taglink|myGravity}} tag if you want to be exact). Visually drawn as a billboarded sprite or 3D model. &lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = highTrajectory&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 2&lt;br /&gt;
|description = Can this weapon be fired in a high trajectory (&amp;gt;45Â° angle). Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - low trajectory only, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - high trajectory only or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - enables a high/low toggle button on the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = heightBoostFactor&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -1.0&lt;br /&gt;
|description = Controls the boost given to {{taglink|range}} by high terrain. Values &amp;gt; &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; result in increased range, &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; means the cannon has fixed range regardless of height difference to target. Any value &amp;lt; &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; (i.e. the default value) result in an automatically calculated value based on {{taglink|range}} and theoretical maximum range.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Cannon Visuals====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = size&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 2.0 + min(default_damage * 0.0025, {{taglink|areaOfEffect}} * 0.1)&lt;br /&gt;
|description = The drawing radius of the billboarded sprite. Also for [[#AircraftBomb Visuals]], [[#EmgCannon Visuals]] (default: &amp;lt;code&amp;gt;3.0&amp;lt;/code&amp;gt;) and [[#Flame Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = colorMap&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = A set of RGB colours to transition between over the projectile&#039;s lifetime. Can be given as a string of RGB digits or an image filename (See [[CColorMap]]). Also for [[#Flame Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sizeDecay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How quickly each particle of the Cannon shot decays in size.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = alphaDecay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How quickly each particle of the Cannon shot fades out.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = separation&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The distance between each particle of the Cannon shot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noGap&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Switch between the distance between particles being proportional to the size of the two particles (&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;) or proportional to the size of the first particle (&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stages&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 5&lt;br /&gt;
|description = The number of particles in each Cannon shot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===DGun===&lt;br /&gt;
Fires a line-of-sight or ballistic projectile (selected via the {{taglink|gravityAffected}} tag). Visually represented by a fireball effect that cannot be customised, however it can be replaced by a 3D model. The name and visual effect are [[OTAism]]s.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = gravityAffected&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the fireball projectile lose height due to map gravity?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===EmgCannon===&lt;br /&gt;
A line-of-sight weapon. Visually drawn as a billboarded sprite very similar to that of the [[#Cannon]], however not as customisable, or a 3D model. The name is another [[OTAism]].&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Flame===&lt;br /&gt;
A line-of-sight weapon intended for use as a flamethrower or similar. Visually drawn as a stream of textured particles, the colour of which can be controlled very precisely using the {{taglink|colorMap}} tag (see [[CColorMap]]).&lt;br /&gt;
&lt;br /&gt;
====Flame Visuals====&lt;br /&gt;
See also {{taglink|colorMap}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sizeGrowth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|description = How much the draw radius of the flame projectile increases each frame.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flameGFXTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.2&lt;br /&gt;
|description = Makes the flamethrower projectile stay alive as a visual-only effect (i.e. does not deal any damage) after it has reached maximum {{taglink|range}}. It is a percentage multiplier, e.g. &amp;lt;code&amp;gt;1.2&amp;lt;/code&amp;gt; makes the projectile stay alive until it reaches 20% beyond {{taglink|range}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===LaserCannon===&lt;br /&gt;
A particularly versatile line-of-sight weapon. Visually drawn like a [http://en.wikipedia.org/wiki/Star_Wars Star Wars] Blaster-style laser weapon, or a 3D model.&lt;br /&gt;
&lt;br /&gt;
====LaserCannon Visuals====&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = duration&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.05&lt;br /&gt;
|description = Multiplied against {{taglink|weaponVelocity}} to determine the visual length of the beam projectile.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = hardStop&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the laser projectile stop dead or fade out?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fallOffRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|description = Rate at which the beam fades out after it goes past its maximum {{taglink|range}} if {{taglink|hardStop|false}}. A value of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; is never fade out, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; is finish fading out exactly at maximum {{taglink|range}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = lodDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1000&lt;br /&gt;
|description = Minimum camera distance at which the default LaserCannon projectile is simplified to a single rectangle.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = thickness&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 2.0&lt;br /&gt;
|description = The thickness (width) of the LaserCannon projectile. Also for [[#BeamLaser Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = coreThickness&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 2.0&lt;br /&gt;
|description = The thickness (width) of the LaserCannon projectile&#039;s core. Also for [[#BeamLaser Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = rgbColor2&lt;br /&gt;
|type = float&lt;br /&gt;
|default = {1.0, 1.0, 1.0}&lt;br /&gt;
|description = The colour of the LaserCannon projectile&#039;s core. Also for [[#BeamLaser Visuals]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===LightningCannon===&lt;br /&gt;
An instant-hit weapon similar to the [[#BeamLaser]], but which does all its damage at once. Visually drawn like [http://en.wikipedia.org/wiki/Star_Wars Star Wars] &#039;Force Lightning&#039; or [http://en.wikipedia.org/wiki/Command_%26_Conquer:_Red_Alert CnC: Red Alert] [http://en.wikipedia.org/wiki/Tesla_coil Tesla Coil] weapons, the effect is not very customisable.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Melee===&lt;br /&gt;
A weapon that always damages the target, no ifs or buts; unsurprisingly intended for use as a close quarters [http://en.wikipedia.org/wiki/Melee#Use_in_gaming &#039;melee&#039;] weapon. It does not fire a projectile and does not care about the line of fire.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===MissileLauncher===&lt;br /&gt;
A versatile weapon which can optionally track targets and accelerate from a low initial velocity.  It can also use {{taglink|trajectoryHeight}} to have the shot arc similar to a ballistic  projectile. Visually represented by a 3D model, with an optional {{taglink|smokeTrail}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = startVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The initial velocity of the weapon projectile. Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = acceleration&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The initial acceleration of the weapon projectile. Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]]. Note that if it is &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; the weapon can never increase from its {{taglink|startVelocity}} and will not reach its maximum {{taglink|weaponVelocity}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tracks&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the weapon projectile track a moving target? Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]].}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The rate (in [[Elmo#Angular|cau]]) at which {{taglink|tracks|true}} weapons turn towards their target. This is relative to a projectile&#039;s current velocity; a weapon with a higher velocity will need a higher value in order to be able to hit targets that turn suddenly.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flightTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The time in seconds before a missile projectile&#039;s fuel runs out; it ceases to obey {{taglink|tracks}}, loses velocity and falls to the ground. Also for [[#StarburstLauncher]]. Large values may cause over/undershoot problems.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fixedLauncher&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Makes the projectile spawn with the orientation of the shooting piece instead of their normal orientation. Also for [[#StarburstLauncher]] and [[#TorpedoLauncher]]. Weapons may not correctly obey [[#Collision &amp;amp; Avoidance|avoidance settings]] when using this tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = wobble&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Adds a random vector to the direction of travel every 16 frames, multiplied by the value of the tag. The effect is reduced as the firing unit gains experience. As this missiles direction is changed, wobbling swarm of missiles will diverge.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = dance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Adds a random vector to the position of a missile projectile every 8 frames, multiplied by the value of the tag. As the projectile is not rotated, a dancing swarm of missiles will remain relatively coherent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trajectoryHeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Determines the height of the arc the missile will reach as it moves towards its target. A value of &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; will result in a flat trajectory, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; will launch at 45&amp;amp;deg;. Can be any value &amp;gt;= &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;; extreme values may require the {{taglink|tracks}} tag to be able to hit a target.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====MissileLauncher Visuals====&lt;br /&gt;
A note about the missile exhaust flare: the size of the flare is determined by the model radius. The emit position of the flare is at (0,0,-radius) so the model may need careful adjustment to get the flare looking right.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = smokeTrail&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the missile projectile emit a smoke trail as it travels? Also for [[#StarburstLauncher]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Rifle===&lt;br /&gt;
An instant hit weapon which does all its damage at once. Visually represented by a hardcoded tracer, firing and hitting effects. Rarely used.&lt;br /&gt;
&lt;br /&gt;
There are no tags specific to this &#039;&#039;&#039;WeaponType&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Shield (WeaponType)===&lt;br /&gt;
As the name suggests, not a weapon but a defensive shield. Can absorb or deflect ({{taglink|repulsor|true}}) projectiles. Individual weapons can be set to be intercepted or not by the shield using a [http://en.wikipedia.org/wiki/Mask_(computing) bitmask] (see [[Shield Interception Tag Use]]). Visually represented as a translucent sphere, with control over colour and texture; by default the shield is invisible ({{taglink|visible|false}}).&lt;br /&gt;
&lt;br /&gt;
See the [[#shield]] sub-table section for other tags specific to this type.&lt;br /&gt;
&lt;br /&gt;
===StarburstLauncher===&lt;br /&gt;
Fires a projectile that rises vertically for {{taglink|weaponTimer}} seconds, then turns towards its target. It can optionally track targets and accelerate from a low initial velocity. This is the only weapon that can be {{taglink|targetable}} and act as an {{taglink|interceptor}}. Visually represented by a 3D model, with an optional {{taglink|smokeTrail}}.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = weaponTimer&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The time in seconds during which the missile ascends vertically before turning towards its target.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===TorpedoLauncher===&lt;br /&gt;
Fires a projectile that will behave ballistically out of water and like a missile in water. Usually used with {{taglink|waterWeapon|true}} so they can fire underwater and target underwater units. An aircraft carrying a [[#TorpedoLauncher]] is a special case, the weapon turns into an [[#AircraftBomb]] projectile that will spawn a torpedo projectile on impact with water. Visually represented by a pointed black cuboid, usually the default object is replaced by a 3D model. &lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = subMissile&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the torpedo leave the water and target units and positions on land?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===NoWeapon===&lt;br /&gt;
Not actually a &#039;&#039;&#039;WeaponType&#039;&#039;&#039;, but an individual weapon requested by Spring to &#039;fill in the gaps&#039; if a unit claims to have a weapon which isn&#039;t actually defined. There needs to be only one of these weapons and it is created by setting {{taglink|weaponName|&amp;quot;NOWEAPON&amp;quot;}} rather than by the {{taglink|weaponType}} tag.&lt;br /&gt;
&lt;br /&gt;
==Sub Tables==&lt;br /&gt;
&lt;br /&gt;
===damage===&lt;br /&gt;
The damage subtable lists how many hit points the weapon depletes against each armor class (See [[Armordefs.lua]]). It is a key-value map of armor class names and damage values. The special &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; entry is as the name suggests the default damage applied to any unit which does not belong to a listed armor class, or to shields.&lt;br /&gt;
&lt;br /&gt;
For example a weapon which deals 100 damage by default but only 50 to units in the &#039;tank&#039; armor class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;damage = {&lt;br /&gt;
    default = 100,&lt;br /&gt;
    tank = 50,&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===shield===&lt;br /&gt;
The preferred way to create a shield or repulsor is to use the shield subtable rather than the old shield tags. &lt;br /&gt;
&lt;br /&gt;
The following tags are repulsor specific:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = repulsor&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the shield [http://dictionary.reference.com/browse/repulse?s=t repulse] (deflect) projectiles or absorb them?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = force&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The force applied by the repulsor to the weapon - higher values will deflect weapons away at higher velocities.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The maximum speed the repulsor will impart to deflected projectiles.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = visibleRepulse&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the (hard-coded) repulse effect rendered or not?}}&lt;br /&gt;
&lt;br /&gt;
The following tags are general behaviour for all shields:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = interceptType&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of weapons that this shield can intercept. Each digit of binary that is set to one means that a weapon with the corresponding digit in its {{taglink|interceptedByShieldType}} will be intercepted by this shield (See [[Shield Interception Tag Use]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = smart&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines whether or not projectiles fired by allied units can pass through the shield (&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;) or are intercepted as enemy weapons are (&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = exterior&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Determines whether or not projectiles fired within the shield&#039;s radius can pass through the shield (&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;) or are intercepted (&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyUse&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource consumed by the shield to absorb or repulse weapons, continually drained by a repulsor as long as the projectile is in range.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radius&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The radius of the circular area the shield covers.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = power&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Essentially the maximum allowed hit-points of the shield - reduced by the &amp;lt;code&amp;gt;damage&amp;lt;/code&amp;gt; of a weapon upon impact.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = startingPower&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How many hit-points the shield starts with - otherwise the shield must regenerate from &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; until it reaches maximum {{taglink|power}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = powerRegen&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How many hit-points the shield regenerates each second.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = powerRegenEnergy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How much energy resource is consumed to regenerate each hit-point.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = rechargeDelay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The delay in seconds before a shield begins to regenerate after it is hit.}}&lt;br /&gt;
&lt;br /&gt;
The following tags control the visual aspects of the shield:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = visible&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the shield visible or not?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = visibleHitFrames&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The number of frames a shield becomes visible for when hit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = badColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {1.0, 0.5, 0.5} (Red)&lt;br /&gt;
|description = The RGB colour the shield transitions to as its hit-points are reduced towards &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = goodColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.5, 0.5, 1.0} (Blue)&lt;br /&gt;
|description = The RGB colour the shield transitions to as its hit-points are regenerated towards its maximum {{taglink|power}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = alpha&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.2&lt;br /&gt;
|description = The alpha transparency of the shield whilst it is visible.}}&lt;br /&gt;
&lt;br /&gt;
===customParams===&lt;br /&gt;
The &amp;lt;code&amp;gt;customParams&amp;lt;/code&amp;gt; subtable of a WeaponDef allows the game designer to give their weapons custom attributes, which can then be accessed via lua gadgets and widgets. It is a map (key-value pair indexed table) of strings. When accessing these attributes in lua the strings can be turned back into numbers, bools or even tables. This gives great control to game designers to essentially implement their own behaviour tags.&lt;br /&gt;
&lt;br /&gt;
There are no additional tags specific to this subtable&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
[http://imolarpg.dyndns.org/trac/balatest/browser/trunk/weapons &#039;Balanced Annihilation&#039; WeaponDefs]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/conflictterra/source/browse/#svn%2Fgames%2FCT%2Fweapons &#039;Conflict Terra&#039; WeaponDefs] (Most are integrated into their [[Units-UnitDefs#Examples|UnitDefs]])&lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/evolutionrts/source/browse/#svn%2Ftrunk%2Fevolutiondev.sdd%2FWeapons &#039;Evolution RTS&#039; WeaponDefs] (Most are integrated into their [[Units-UnitDefs#Examples|UnitDefs]])&lt;br /&gt;
&lt;br /&gt;
[http://spring1944.svn.sourceforge.net/viewvc/spring1944/trunk/S44Main.sdd/weapons/ &#039;Spring: 1944&#039; WeaponDefs] (Implements an [http://en.wikipedia.org/wiki/Object-oriented_programming OOP] paradigm with [http://en.wikipedia.org/wiki/Inheritance_(computer_science) inheritance])&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/springtutorialgame/source/browse/#svn%2Ftrunk%2FSpringTutorialGame.sdd%2FWeapons &#039;Spring Tutorial Game&#039; WeaponDefs]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Units]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=CEG-Format&amp;diff=3806</id>
		<title>CEG-Format</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=CEG-Format&amp;diff=3806"/>
		<updated>2013-08-13T17:47:09Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* Conditions */ Underwater tag works.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Source:&#039;&#039;&#039; {{sourcelink|file=rts/Sim/Projectiles}}&lt;br /&gt;
&lt;br /&gt;
== Overall Format ==&lt;br /&gt;
&lt;br /&gt;
A CEG file contains one or more CEGs. Each CEG follows this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
[ceg_name] {&lt;br /&gt;
  useDefaultExplosions = 0;&lt;br /&gt;
  [spawner_name_0] {&lt;br /&gt;
     class=CClassName;&lt;br /&gt;
     [properties] {&lt;br /&gt;
       property0 = value0;&lt;br /&gt;
       property1 = value1;&lt;br /&gt;
       //and so on...&lt;br /&gt;
     }&lt;br /&gt;
     condition0 = 1;&lt;br /&gt;
     condition1 = 0;&lt;br /&gt;
     count = 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  [spawner_name_1] {&lt;br /&gt;
     //each spawner follows that format&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  [groundflash] {&lt;br /&gt;
     //groundflash is a special name; it always generates a groundflash&lt;br /&gt;
     flashsize=16;&lt;br /&gt;
     flashalpha=1;&lt;br /&gt;
     circlegrowth=1;&lt;br /&gt;
     circlealpha=0;&lt;br /&gt;
     ttl=8;&lt;br /&gt;
     color=1,1,1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== useDefaultExplosions ===&lt;br /&gt;
If this is set, the CEG will use the default explosion (based on damage and area of effect) in addition to any spawners you define.&lt;br /&gt;
&lt;br /&gt;
=== Spawners ===&lt;br /&gt;
A CEG can contain any number of spawners. The name of the spawners don&#039;t really matter, as long as it&#039;s not &amp;quot;groundflash&amp;quot;, which has a special meaning. You can think of each spawner as being one component of the overall explosion.&lt;br /&gt;
&lt;br /&gt;
==== Class ====&lt;br /&gt;
Each spawner has a class that determines what kind of graphical effect it creates. Spring has a number of standard classes that you can choose from. See [[CEG-Classes]] for details.&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
Depending on what class a spawner is, it will have a set of properties that allow you to fine-tune what the spawner displays. Again, see [[CEG-Classes]] for details.&lt;br /&gt;
&lt;br /&gt;
==== Conditions ====&lt;br /&gt;
These determine under what conditions the spawner will run. The available conditions are &amp;quot;air&amp;quot; (at least 20 elmos above ground/sea level), &amp;quot;water&amp;quot;, &amp;quot;underwater&amp;quot;, &amp;quot;ground&amp;quot;, &amp;quot;unit&amp;quot; (hits a unit), and &amp;quot;nounit&amp;quot; (doesn&#039;t hit a unit). If you set the condition to true (e.g., &amp;quot;water = 1;&amp;quot;), the spawner will run if the explosion takes place under that condition. If you set more than one condition, the spawner will run if &#039;&#039;any&#039;&#039; of them are true. If you want a spawner to run only if two or more conditions are &#039;&#039;all&#039;&#039; true, you have to do a little trick with the CExpGenSpawner class.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
The count determines the number of times the spawner will run.&lt;br /&gt;
&lt;br /&gt;
=== groundflash ===&lt;br /&gt;
If you name a spawner &amp;quot;groundflash,&amp;quot; it will always generate a groundflash. A groundflash has the following properties:&lt;br /&gt;
&lt;br /&gt;
*flashsize (float): The radius of the groundflash.&lt;br /&gt;
*flashalpha (float in [0, 1]): How transparent the groundflash is. Generally, the higher, the brighter.&lt;br /&gt;
*circlegrowth (float): A groundflash can have an additional circle that expands outwards. This controls how fast the circle grows.&lt;br /&gt;
*circlealpha (float in [0, 1]): How transparent the circle is.&lt;br /&gt;
*ttl (int): How long the groundflash lasts.&lt;br /&gt;
*color (float3): The color of the groundflash.&lt;br /&gt;
&lt;br /&gt;
Suggested Use: A short groundflash (~8 frames) is good for any explosion that gives off light. You can also use a longer groundflash to suggest the ground is glowing from heat.&lt;br /&gt;
&lt;br /&gt;
=== Data Types ===&lt;br /&gt;
CEGs use the following data types:&lt;br /&gt;
&lt;br /&gt;
*float: Most properties are floats. e.g. `0.123`&lt;br /&gt;
*int: Used for counts and ttls. e.g. `1234`&lt;br /&gt;
*bool: Use for conditions, and some properties. e.g. `true`, `1`, `false`&lt;br /&gt;
*float3: Used for vectors and colors. The components are floats, separated by commas. You can also use the keyword &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt;, which represents the direction fed to the CEG. e.g. &amp;quot;0.1 , 1.2 , 3.4&amp;quot;, &amp;quot;dir&amp;quot;&lt;br /&gt;
*string: Used for colormaps and texture names. In .lua you delimit a string by quotes; in .tdf you do not. Color maps consist of 2 or more groups of 4 numbers, each group representing a RGBA color. Textures are the names you define in gamedata/resources.tdf or gamedata/resources.lua. e.g. &amp;quot;1.0 0.0 0.0 1      0 0 1.0 1&amp;quot; (are gradient from red to blue)&lt;br /&gt;
&lt;br /&gt;
You can use [[CEG-Operators]] to define floats that are not fixed.&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
&lt;br /&gt;
All distances are in elmos; all time is in frames.&lt;br /&gt;
&lt;br /&gt;
[[Category:CEG]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11751</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=11751"/>
		<updated>2013-07-04T14:47:55Z</updated>

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

		<summary type="html">&lt;p&gt;Kingraptor: Add Ren&amp;#039;Py in a misc section at the end (didn&amp;#039;t know where to put it)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game Development =&lt;br /&gt;
This information is meant to help newcomers learn how to develop their own games for the Spring Engine.&lt;br /&gt;
&lt;br /&gt;
= General =&lt;br /&gt;
&lt;br /&gt;
*[[Game structure]]&lt;br /&gt;
*[[VirtualFileSystem]]&lt;br /&gt;
*[[Game specification|Game specification]]&lt;br /&gt;
*[http://answers.springlobby.info/ Q&amp;amp;A Site for the Spring Engine]&lt;br /&gt;
&lt;br /&gt;
= Templates =&lt;br /&gt;
*[[SpringABC]] - 3 Templates of Increasing Complexity&lt;br /&gt;
*[[SpringTutorialGame|Spring Tutorial Game]] - A Tutorial Template Game with full examples&lt;br /&gt;
&lt;br /&gt;
= Technical Documentation =&lt;br /&gt;
; &#039;&#039;&#039;GameData&#039;&#039;&#039;&lt;br /&gt;
* [[Armordefs.lua]]&lt;br /&gt;
* [[Icontypes.lua]]&lt;br /&gt;
* [[Messages.lua]]&lt;br /&gt;
* [[Modinfo.lua]]&lt;br /&gt;
* [[Modrules.lua]] - Global game variables&lt;br /&gt;
* [[Movedefs.lua]]&lt;br /&gt;
* [[Resources.lua]]&lt;br /&gt;
* [[Sidedata.lua]]&lt;br /&gt;
* [[Sounds.lua]]&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Definition Files&#039;&#039;&#039;&lt;br /&gt;
* [[Units-UnitDefs]] - define the attributes of units&lt;br /&gt;
* [[Units-WeaponDefs]] - define the attributes of weapons/projectiles&lt;br /&gt;
* [[Units-FeatureDefs]] - define the attributes of static map features and wrecks&lt;br /&gt;
* [[CEG]] Particle effects (explosions etc)&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Lua API &amp;amp; Libraries&#039;&#039;&#039;&lt;br /&gt;
* [[Lua_Scripting|Lua API Documentation]]&lt;br /&gt;
* [[LUPS]] - Lua Particle System&lt;br /&gt;
* [[Chili]] - A GUI Framework&lt;br /&gt;
* [[Custom Unit Shaders]] - Normal mapping and more&lt;br /&gt;
* {{forumlink|topic=28341|title=ChangePiece}} - Switch piece geometry&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Animation&#039;&#039;&#039;&lt;br /&gt;
Lua Animations&lt;br /&gt;
*[[Animation-LuaScripting]]&lt;br /&gt;
**[[Animation-LuaCallins]]&lt;br /&gt;
**[[Animation-LuaCallouts]]&lt;br /&gt;
**[[Animation-CobLuaDifferences]]&lt;br /&gt;
&lt;br /&gt;
COB Animations (Deprecated)&lt;br /&gt;
*[[Animation-CobOverview]]&lt;br /&gt;
**[[Animation-CobAnimation]]&lt;br /&gt;
**[[Animation-CobCallins]]&lt;br /&gt;
**[[Animation-CobConstants]]&lt;br /&gt;
**[[Animation-CobThreads]]&lt;br /&gt;
**[[Animation-CobHitByWeaponID]]&lt;br /&gt;
**[[Units:LuaCOB]] - how to interface COB with LUA&lt;br /&gt;
**[[CEG_For_Units|Game Development:Calling basic CEGs from COB]]&lt;br /&gt;
**{{forumlink|topic=132943#132943|title=GPL COB Examples}}&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Unit Development&#039;&#039;&#039;&lt;br /&gt;
* [[Unit_collision_volumes | Unit Collision Volumes]] - collision detection&lt;br /&gt;
* [[Units:WeaponMainDir]]&lt;br /&gt;
* [[Units:Buildpics]]&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Models &amp;amp; Textures&#039;&#039;&#039;&lt;br /&gt;
* [[About_s3o|.s3o]]&lt;br /&gt;
* [[Assimp]]&lt;br /&gt;
* [[Units:Textures]]&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Misc&#039;&#039;&#039;&lt;br /&gt;
* [[MouseCursors]]&lt;br /&gt;
* [[Mod Development:Archives|Game Development:Archives]]&lt;br /&gt;
* [[Mod Development:Sidepics|Game Development:Sidepics]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
== In-Game Tools ==&lt;br /&gt;
*[[ToolBox]] - A Collection of Game Development Tools&lt;br /&gt;
*[[Map Making: Feature Placer|Feature Placer]] - A Map Feature &amp;amp; NPC Unit Placement Tool&lt;br /&gt;
== External Tools ==&lt;br /&gt;
* [[Upspring]]&lt;br /&gt;
* [[Map,_Mod,_And_Unit_Development_Programs|Development Tools]]&lt;br /&gt;
&lt;br /&gt;
= Engine Related =&lt;br /&gt;
* [[Download_Testing]] - Test the compatibility of your game on upcoming versions of the Spring engine.&lt;br /&gt;
&lt;br /&gt;
= Tutorials =&lt;br /&gt;
== Game Development Tutorials ==&lt;br /&gt;
*[[The Complete Guide To Making A Spring Game]] - A fairly comprehensive getting started tutorial.&lt;br /&gt;
*[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=26409| Porting TA content to Spring]&lt;br /&gt;
*&amp;lt;strike&amp;gt;[[Simple Mod Tutorial|Simple Game Tutorial]]&amp;lt;/strike&amp;gt; - needs to be updated&lt;br /&gt;
&lt;br /&gt;
==Modelling Tutorials==&lt;br /&gt;
&#039;&#039;&#039;Wings3D&#039;&#039;&#039;&lt;br /&gt;
* [[Units:CreateModel]]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?t=10612 Wings UV Mapping Tutorial]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=9&amp;amp;t=12354 Saving polygons in Wings3d Tutorial]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Blender&#039;&#039;&#039;&lt;br /&gt;
* [[TutorialBlenderWorkFlow|Blender Workflow Tutorial]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3DS Max&#039;&#039;&#039;&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?t=10503 Runecrafter&#039;s 3DS Max UV Mapping Tutorial]&lt;br /&gt;
&lt;br /&gt;
==Texturing Tutorials==&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=57&amp;amp;t=22392 DDS Textures:  How To]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?t=10947 Greeble Tutorial 1]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=9&amp;amp;t=12356 Greeble Tutorial 2]&lt;br /&gt;
&lt;br /&gt;
=Misc=&lt;br /&gt;
* [[Ren&#039;Py]]: a visual novel engine that can be used with Spring&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Dev]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Ren%27Py&amp;diff=15917</id>
		<title>Ren&#039;Py</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Ren%27Py&amp;diff=15917"/>
		<updated>2013-06-14T02:11:42Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Ren&amp;#039;Py&amp;#039;&amp;#039;&amp;#039; is an open source visual novel engine, available [http://www.renpy.org/ here]. It can be used in conjunction with Spring to provide a singleplayer experience with...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Ren&#039;Py&#039;&#039;&#039; is an open source visual novel engine, available [http://www.renpy.org/ here]. It can be used in conjunction with Spring to provide a singleplayer experience with narrative, dialogue, images and videos.&lt;br /&gt;
&lt;br /&gt;
== Using Ren&#039;Py with Spring ==&lt;br /&gt;
Without the use of sockets, Ren&#039;Py and Spring can best communicate in the following way:&lt;br /&gt;
&lt;br /&gt;
=== Ren&#039;Py to Spring ===&lt;br /&gt;
Python can read a Spring startscript and modify it, say using [http://docs.python.org/2/library/string.html#formatstrings str.format] or the older [http://docs.python.org/2/library/stdtypes.html#string-formatting % (modulo) operator]. In this way, any arbitrary game, per-player or per-team information can be made available to Spring at runtime. It is also theoretically possible for Python to modify the contents of an .sdz or .sdd archive directly, but this is not recommended.&lt;br /&gt;
&lt;br /&gt;
=== Spring to Ren&#039;Py ===&lt;br /&gt;
A widget or gadget can write a Python file with any information to be communicated to Ren&#039;Py, which it can then import as a module. Bear in mind that because Spring is limited in which directories its Lua can write files to, Ren&#039;Py will need to know where the Spring datadir is.&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
[https://code.google.com/p/springpy/ SpringPy] is a code example for Spring-Ren&#039;Py communication. You can check out the whole repo and open/run the Ren&#039;Py project with the Ren&#039;Py SDK.&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/game/script.rpy Example script.rpy]&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/spring/script_pytest.txt Example startscript]&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/spring/LuaUI/Widgets/api_shared_functions.lua Widget to write Python dictionaries and module files]&lt;br /&gt;
* [https://code.google.com/p/springpy/source/browse/trunk/spring/LuaUI/Widgets/dbg_test.lua Test widget]: writes data required by sample code on widget:Initialize()&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11746</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=11746"/>
		<updated>2013-02-21T17:12:25Z</updated>

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

		<summary type="html">&lt;p&gt;Kingraptor: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The new callouts are defined in the Spring.UnitScript table.&lt;br /&gt;
&lt;br /&gt;
Types for arguments are only shown where they&#039;re ambiguous. For a number of (common) arguments, the types are:&lt;br /&gt;
&lt;br /&gt;
* unitID: number&lt;br /&gt;
* piece: number&lt;br /&gt;
* axis: number (1 = x axis, 2 = y axis, 3 = z axis)&lt;br /&gt;
* destination: number (elmos (linear), radians (angular))&lt;br /&gt;
* speed: number (elmos per second (linear), radians per second (angular))&lt;br /&gt;
* accel/decel: number (radians per second per frame)&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetPieceVisibility&#039;&#039;&#039; ( piece, boolean visible ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Show&#039;&#039;&#039; ( piece ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Hide&#039;&#039;&#039; ( piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
These may be used to show/hide pieces of the unit&#039;s model.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Move&#039;&#039;&#039; ( piece, axis, destination[, speed] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Move piece along axis to the destination position. If speed is given, the piece isn&#039;t moved immediately, but will move there at the desired speed. The X axis is mirrored compared to BOS/COB scripts, to match the direction of the X axis in Spring world space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Turn&#039;&#039;&#039; ( piece, axis, destination[, speed] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Turn piece around axis to the destination angle. If speed is given, the piece isn&#039;t rotated immediately, but will turn at the desired angular velocity. Angles are in radians.&lt;br /&gt;
Always uses the shortest angular towards destinationdegree, and if at exactly 180 degrees opposide, will go counterclockwise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Spin&#039;&#039;&#039; ( piece, axis, speed[, accel] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Makes piece spin around axis at the desired angular velocity. If accel is given, the piece does not start at this velocity at once, but will accelerate to it. Both negative and positive angular velocities are supported. Accel should always be positive, even if speed is negative.&lt;br /&gt;
&lt;br /&gt;
Beware gimbal lock: http://en.wikipedia.org/wiki/Gimbal_lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.StopSpin&#039;&#039;&#039; ( piece, axis[, decel] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Stops a piece from spinning around the given axis. If decel is given, the piece does not stop at once, but will decelerate to it. Decel should always be positive. This function is similar to Spin(piece, axis, 0, decel), however, StopSpin also frees up the animation record.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.IsInTurn&#039;&#039;&#039; (number piece, number axis) -&amp;gt; boolean&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.IsInMove&#039;&#039;&#039; (number piece, number axis) -&amp;gt; boolean&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.IsInSpin&#039;&#039;&#039; (number piece, number axis) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
Returns true if such an animation exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetPieceTranslation&#039;&#039;&#039; ( piece ) -&amp;gt; number x, y, z&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetPieceRotation&#039;&#039;&#039; ( piece ) -&amp;gt; number x, y, z&lt;br /&gt;
&lt;br /&gt;
Get the current translation/rotation of a piece. The returned numbers match the values passed into Move and Turn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetPiecePosDir&#039;&#039;&#039; ( piece ) -&amp;gt; number px, py, pz, dx, dy, dz&lt;br /&gt;
&lt;br /&gt;
Get the piece&#039;s position (px, py, pz) and direction (dx, dy, dz) in &#039;&#039;&#039;unit space&#039;&#039;&#039;. This is quite similar to &#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;, however that function returns in &#039;&#039;&#039;world space&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Threads ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.StartThread&#039;&#039;&#039; ( function fun, ... ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Starts a new (animation) thread, which will execute the function &#039;fun&#039;. All arguments except the function to run are passed as-is as arguments to &#039;fun&#039;. [[Animation-CobThreads|COB-Threads]] has a decent description on COB threads, which are mimicked here in Lua using coroutines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetSignalMask&#039;&#039;&#039; ( number mask ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Signal&#039;&#039;&#039; ( number signal ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
These two support functions offer a powerful way to kill running threads. SetSignalMask assigns a mask to the currently running thread (any new threads started by this one will inherit the signal mask). Signal immediately stops all threads of this unit for which the bitwise and of mask and signal is not zero.&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=26274&amp;amp;start=2| What signal will stop which threads?]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.WaitForMove&#039;&#039;&#039; ( piece, axis ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.WaitForTurn&#039;&#039;&#039; ( piece, axis ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Waits until the piece has stopped moving along / turning around the axis. If the piece is not animating, this functions return at once. You can not wait for a spin, because a spin does never finish.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Sleep&#039;&#039;&#039; ( number milliseconds ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Waits a number of milliseconds before returning.&lt;br /&gt;
&lt;br /&gt;
== Effects ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.EmitSfx&#039;&#039;&#039; ( piece, number id ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Emits a [[CEG]] effect or weapon from the given piece. The id is based on one of the effect or weapon ids defined in the units unitdef.&amp;lt;br&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--get the id of the CEG effects:&lt;br /&gt;
local smokecloud = SFX.CEG   --the first effect from the list in the unitdef&lt;br /&gt;
local smokecloud2 = SFX.CEG +1   --the second effect from the list in the unitdef&lt;br /&gt;
local fire = SFX.CEG +2   --the third effect from the list in the unitdef&lt;br /&gt;
--get the id of the emiter piece:&lt;br /&gt;
local turret = piece &amp;quot;turret&amp;quot;&lt;br /&gt;
EmitSfx(turret, smokecloud)   --emit the first effect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.ShowFlare&#039;&#039;&#039; ( number piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Same as COB&#039;s show _inside_ FireWeaponX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Explode&#039;&#039;&#039; ( piece, number flags ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Explodes a piece, optionally creating a particle which flies off. Typically used inside Killed. Explode does not hide the piece by itself; if using it outside Killed you may want to Hide the piece immediately after. The flags may be any combination of:&lt;br /&gt;
* &#039;&#039;&#039;SFX.NONE&#039;&#039;&#039;: do nothing after creating a heatcloud. Other flags have no effect, except NO_HEATCLOUD. If that is given too, the call is a no-op.&lt;br /&gt;
* &#039;&#039;&#039;SFX.SHATTER&#039;&#039;&#039;: shatter the piece in many fragments. Only the NO_HEATCLOUD flag has any effect if this is present.&lt;br /&gt;
* &#039;&#039;&#039;SFX.EXPLODE&#039;&#039;&#039; | &#039;&#039;&#039;SFX.EXPLODE_ON_HIT&#039;&#039;&#039;: the piece that flies of should explode when it hits something.&lt;br /&gt;
* &#039;&#039;&#039;SFX.FALL&#039;&#039;&#039;: the piece should be affected by gravity (this is currently always forced on by Spring, to prevent pieces that float in air indefinitely).&lt;br /&gt;
* &#039;&#039;&#039;SFX.SMOKE&#039;&#039;&#039;: leave smoke trail.&lt;br /&gt;
* &#039;&#039;&#039;SFX.FIRE&#039;&#039;&#039;: the piece is on fire when it flies off.&lt;br /&gt;
* &#039;&#039;&#039;SFX.NO_CEG_TRAIL&#039;&#039;&#039;: disable a CEG trail, if present.&lt;br /&gt;
* &#039;&#039;&#039;SFX.NO_HEATCLOUD&#039;&#039;&#039;: suppress the heat cloud that&#039;s shown by default.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.AttachUnit&#039;&#039;&#039; ( piece, passengerID ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.DropUnit&#039;&#039;&#039; ( passengerID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Attaches or detaches another unit (a passenger, as this is designed for transports) to this unit. For AttachUnit, piece specifies the attachment point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetUnitValue&#039;&#039;&#039; ( ... ) -&amp;gt; number | number, number&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetUnitValue&#039;&#039;&#039; ( ... ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This may be used instead of COB&#039;s get and set codes. It is recommended however, to use dedicated Lua functions (e.g. Spring.GetUnitHealth(unitID) instead of GetUnitValue(4)): these functions should be considered a relic of the past.&lt;br /&gt;
&lt;br /&gt;
Note that these are identical to Spring.GetUnitCOBValue and Spring.SetUnitCOBValue (see also [[Lua_SyncedCtrl#Lua_to_COB]] for the signature of those functions), except that an unitID argument shouldn&#039;t be passed to the versions in the Spring.UnitScript table.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetLongestReloadTime&#039;&#039;&#039; ( unitID ) -&amp;gt; number reloadTime&lt;br /&gt;
&lt;br /&gt;
Returns max(reload time) of all the unit&#039;s weapons in milliseconds. This utility function exists to aid in porting BOS scripts, which have a SetMaxReloadTime call-in that is called immediately after Create.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Internal ==&lt;br /&gt;
&lt;br /&gt;
You generally shouldn&#039;t need any of the following call-outs, they are provided by the engine to allow the Lua framework to do it&#039;s work.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.CreateScript&#039;&#039;&#039; ( unitID, table callIns ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This deletes the unit&#039;s current script (whether it&#039;s a COB or Lua script doesn&#039;t matter), and sets it up with a brand new Lua unit script, initially registering the call-ins given in the table as (string, function) pairs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.UpdateCallIn&#039;&#039;&#039; ( unitID, string name[, function callIn] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This updates a single call-in for the unit&#039;s current &#039;&#039;&#039;Lua&#039;&#039;&#039; unit script. If the unit does not currently have a Lua unit script, an error is raised. If the callIn argument is not given (or nil), the call-in with the given name is removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.CallAsUnit&#039;&#039;&#039; ( unitID, function fun, ... ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
As none of the call-outs takes a unitID, the engine needs to know the &#039;&#039;active unit&#039;&#039; when one of those is called. Using this function another function can be called with the active unit set arbitrarily.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetDeathScriptFinished&#039;&#039;&#039; ( [number wreckLevel] )&lt;br /&gt;
&lt;br /&gt;
Tells Spring the Killed script finished, and which wreckLevel to use. If wreckLevel is not given no wreck is created. May only be called after Killed has been called. DO NOT USE, the framework handles this transparently (it passes the return value of Killed into this function.)&lt;br /&gt;
[[Category:Unit_development]]&lt;br /&gt;
[[Category:Animation]]&lt;br /&gt;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-LuaCallouts&amp;diff=2034</id>
		<title>Animation-LuaCallouts</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-LuaCallouts&amp;diff=2034"/>
		<updated>2012-11-04T05:09:26Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Clarified units of measure in the introduction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The new callouts are defined in the Spring.UnitScript table.&lt;br /&gt;
&lt;br /&gt;
Types for arguments are only shown where they&#039;re ambiguous. For a number of (common) arguments, the types are:&lt;br /&gt;
&lt;br /&gt;
* unitID: number&lt;br /&gt;
* piece: number&lt;br /&gt;
* axis: number (1 = x axis, 2 = y axis, 3 = z axis)&lt;br /&gt;
* destination: number (elmos (linear), radians (angular))&lt;br /&gt;
* speed: number (elmos (linear), radians per second (angular))&lt;br /&gt;
* accel/decel: number (radians per second per frame)&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetPieceVisibility&#039;&#039;&#039; ( piece, boolean visible ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Show&#039;&#039;&#039; ( piece ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Hide&#039;&#039;&#039; ( piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
These may be used to show/hide pieces of the unit&#039;s model.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Move&#039;&#039;&#039; ( piece, axis, destination[, speed] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Move piece along axis to the destination position. If speed is given, the piece isn&#039;t moved immediately, but will move there at the desired speed. The X axis is mirrored compared to BOS/COB scripts, to match the direction of the X axis in Spring world space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Turn&#039;&#039;&#039; ( piece, axis, destination[, speed] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Turn piece around axis to the destination angle. If speed is given, the piece isn&#039;t rotated immediately, but will turn at the desired angular velocity. Angles are in radians.&lt;br /&gt;
Always uses the shortest angular towards destinationdegree, and if at exactly 180 degrees opposide, will go counterclockwise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Spin&#039;&#039;&#039; ( piece, axis, speed[, accel] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Makes piece spin around axis at the desired angular velocity. If accel is given, the piece does not start at this velocity at once, but will accelerate to it. Both negative and positive angular velocities are supported. Accel should always be positive, even if speed is negative.&lt;br /&gt;
&lt;br /&gt;
Beware gimbal lock: http://en.wikipedia.org/wiki/Gimbal_lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.StopSpin&#039;&#039;&#039; ( piece, axis[, decel] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Stops a piece from spinning around the given axis. If decel is given, the piece does not stop at once, but will decelerate to it. Decel should always be positive. This function is similar to Spin(piece, axis, 0, decel), however, StopSpin also frees up the animation record.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.IsInTurn&#039;&#039;&#039; (number piece, number axis) -&amp;gt; boolean&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.IsInMove&#039;&#039;&#039; (number piece, number axis) -&amp;gt; boolean&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.IsInSpin&#039;&#039;&#039; (number piece, number axis) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
Returns true if such an animation exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetPieceTranslation&#039;&#039;&#039; ( piece ) -&amp;gt; number x, y, z&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetPieceRotation&#039;&#039;&#039; ( piece ) -&amp;gt; number x, y, z&lt;br /&gt;
&lt;br /&gt;
Get the current translation/rotation of a piece. The returned numbers match the values passed into Move and Turn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetPiecePosDir&#039;&#039;&#039; ( piece ) -&amp;gt; number px, py, pz, dx, dy, dz&lt;br /&gt;
&lt;br /&gt;
Get the piece&#039;s position (px, py, pz) and direction (dx, dy, dz) in &#039;&#039;&#039;unit space&#039;&#039;&#039;. This is quite similar to &#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;, however that function returns in &#039;&#039;&#039;world space&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Threads ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.StartThread&#039;&#039;&#039; ( function fun, ... ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Starts a new (animation) thread, which will execute the function &#039;fun&#039;. All arguments except the function to run are passed as-is as arguments to &#039;fun&#039;. [[Animation-CobThreads|COB-Threads]] has a decent description on COB threads, which are mimicked here in Lua using coroutines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetSignalMask&#039;&#039;&#039; ( number mask ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Signal&#039;&#039;&#039; ( number signal ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
These two support functions offer a powerful way to kill running threads. SetSignalMask assigns a mask to the currently running thread (any new threads started by this one will inherit the signal mask). Signal immediately stops all threads of this unit for which the bitwise and of mask and signal is not zero.&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=26274&amp;amp;start=2| What signal will stop which threads?]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.WaitForMove&#039;&#039;&#039; ( piece, axis ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.WaitForTurn&#039;&#039;&#039; ( piece, axis ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Waits until the piece has stopped moving along / turning around the axis. If the piece is not animating, this functions return at once. You can not wait for a spin, because a spin does never finish.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Sleep&#039;&#039;&#039; ( number milliseconds ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Waits a number of milliseconds before returning.&lt;br /&gt;
&lt;br /&gt;
== Effects ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.EmitSfx&#039;&#039;&#039; ( piece, number id ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Emits a [[CEG]] effect or weapon from the given piece. The id is based on one of the effect or weapon ids defined in the units unitdef.&amp;lt;br&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--get the id of the CEG effects:&lt;br /&gt;
local smokecloud = SFX.CEG   --the first effect from the list in the unitdef&lt;br /&gt;
local smokecloud2 = SFX.CEG +1   --the second effect from the list in the unitdef&lt;br /&gt;
local fire = SFX.CEG +2   --the third effect from the list in the unitdef&lt;br /&gt;
--get the id of the emiter piece:&lt;br /&gt;
local turret = piece &amp;quot;turret&amp;quot;&lt;br /&gt;
EmitSfx(turret, smokecloud)   --emit the first effect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.ShowFlare&#039;&#039;&#039; ( number piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Same as COB&#039;s show _inside_ FireWeaponX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.Explode&#039;&#039;&#039; ( piece, number flags ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Explodes a piece, optionally creating a particle which flies off. Typically used inside Killed. Explode does not hide the piece by itself; if using it outside Killed you may want to Hide the piece immediately after. The flags may be any combination of:&lt;br /&gt;
* &#039;&#039;&#039;SFX.NONE&#039;&#039;&#039;: do nothing after creating a heatcloud. Other flags have no effect, except NO_HEATCLOUD. If that is given too, the call is a no-op.&lt;br /&gt;
* &#039;&#039;&#039;SFX.SHATTER&#039;&#039;&#039;: shatter the piece in many fragments. Only the NO_HEATCLOUD flag has any effect if this is present.&lt;br /&gt;
* &#039;&#039;&#039;SFX.EXPLODE&#039;&#039;&#039; | &#039;&#039;&#039;SFX.EXPLODE_ON_HIT&#039;&#039;&#039;: the piece that flies of should explode when it hits something.&lt;br /&gt;
* &#039;&#039;&#039;SFX.FALL&#039;&#039;&#039;: the piece should be affected by gravity (this is currently always forced on by Spring, to prevent pieces that float in air indefinitely).&lt;br /&gt;
* &#039;&#039;&#039;SFX.SMOKE&#039;&#039;&#039;: leave smoke trail.&lt;br /&gt;
* &#039;&#039;&#039;SFX.FIRE&#039;&#039;&#039;: the piece is on fire when it flies off.&lt;br /&gt;
* &#039;&#039;&#039;SFX.NO_CEG_TRAIL&#039;&#039;&#039;: disable a CEG trail, if present.&lt;br /&gt;
* &#039;&#039;&#039;SFX.NO_HEATCLOUD&#039;&#039;&#039;: suppress the heat cloud that&#039;s shown by default.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.AttachUnit&#039;&#039;&#039; ( piece, passengerID ) -&amp;gt; nil&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.DropUnit&#039;&#039;&#039; ( passengerID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Attaches or detaches another unit (a passenger, as this is designed for transports) to this unit. For AttachUnit, piece specifies the attachment point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetUnitValue&#039;&#039;&#039; ( ... ) -&amp;gt; number | number, number&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetUnitValue&#039;&#039;&#039; ( ... ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This may be used instead of COB&#039;s get and set codes. It is recommended however, to use dedicated Lua functions (e.g. Spring.GetUnitHealth(unitID) instead of GetUnitValue(4)): these functions should be considered a relic of the past.&lt;br /&gt;
&lt;br /&gt;
Note that these are identical to Spring.GetUnitCOBValue and Spring.SetUnitCOBValue (see also [[Lua_SyncedCtrl#Lua_to_COB]] for the signature of those functions), except that an unitID argument shouldn&#039;t be passed to the versions in the Spring.UnitScript table.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.GetLongestReloadTime&#039;&#039;&#039; ( unitID ) -&amp;gt; number reloadTime&lt;br /&gt;
&lt;br /&gt;
Returns max(reload time) of all the unit&#039;s weapons in milliseconds. This utility function exists to aid in porting BOS scripts, which have a SetMaxReloadTime call-in that is called immediately after Create.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Internal ==&lt;br /&gt;
&lt;br /&gt;
You generally shouldn&#039;t need any of the following call-outs, they are provided by the engine to allow the Lua framework to do it&#039;s work.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.CreateScript&#039;&#039;&#039; ( unitID, table callIns ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This deletes the unit&#039;s current script (whether it&#039;s a COB or Lua script doesn&#039;t matter), and sets it up with a brand new Lua unit script, initially registering the call-ins given in the table as (string, function) pairs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.UpdateCallIn&#039;&#039;&#039; ( unitID, string name[, function callIn] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This updates a single call-in for the unit&#039;s current &#039;&#039;&#039;Lua&#039;&#039;&#039; unit script. If the unit does not currently have a Lua unit script, an error is raised. If the callIn argument is not given (or nil), the call-in with the given name is removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.CallAsUnit&#039;&#039;&#039; ( unitID, function fun, ... ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
As none of the call-outs takes a unitID, the engine needs to know the &#039;&#039;active unit&#039;&#039; when one of those is called. Using this function another function can be called with the active unit set arbitrarily.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UnitScript.SetDeathScriptFinished&#039;&#039;&#039; ( [number wreckLevel] )&lt;br /&gt;
&lt;br /&gt;
Tells Spring the Killed script finished, and which wreckLevel to use. If wreckLevel is not given no wreck is created. May only be called after Killed has been called. DO NOT USE, the framework handles this transparently (it passes the return value of Killed into this function.)&lt;br /&gt;
[[Category:Unit_development]]&lt;br /&gt;
[[Category:Animation]]&lt;br /&gt;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12370</id>
		<title>Lua UnsyncedRead</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12370"/>
		<updated>2012-11-02T19:18:28Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* GUI Settings */  Corrected GetMapDrawMode&amp;#039;s return value when in pathing (F2) view&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
=Unsynced Read=&lt;br /&gt;
&lt;br /&gt;
== Replay/Spectating ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsReplay&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSpectatingState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean spectating, boolean fullView, boolean fullSelect&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModUICtrl&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Local Player,Team,Ally ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Redundant same as the GetMyXYZ functions!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playerID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number allyID&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerRoster&#039;&#039;&#039;&lt;br /&gt;
  ( [number sortType] ) -&amp;gt;&lt;br /&gt;
    nil | playerTable = {&lt;br /&gt;
            [1] = {&lt;br /&gt;
              string  name,&lt;br /&gt;
              number  playerID,&lt;br /&gt;
              number  teamID,&lt;br /&gt;
              number  allyTeamID,&lt;br /&gt;
              boolean spectator,&lt;br /&gt;
              number  cpuUsage,&lt;br /&gt;
              number  pingTime&lt;br /&gt;
            },&lt;br /&gt;
            etc...&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  Sort codes:&lt;br /&gt;
     1 = Sort by allies  (the default)&lt;br /&gt;
     2 = Sort by teamID&lt;br /&gt;
     3 = Sort by playerName&lt;br /&gt;
     4 = Sort by CPU usage&lt;br /&gt;
     5 = Sort by ping time&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamOrigColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerTraffic&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID [, number packetID] ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSoundStreamTime&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playedTime, number totalTime&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraNames&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [camName] = number camNum, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
&lt;br /&gt;
See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraPosition&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraDirection&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number forward_x, number forward_y, number forward_z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraFOV&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number fov&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraVectors&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; vectorTable = {&lt;br /&gt;
    forward   = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    up        = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    right     = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    top       = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    bottom    = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    leftside  = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    rightside = { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleUnits&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 [, number radius = 30 [, boolean Icons = true ]]] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1 [, number radius = 30 [, boolean Icons = true [, boolean geos = true ]]]] )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAABBInView&#039;&#039;&#039;&lt;br /&gt;
  ( number minX, number minY, number minZ,&lt;br /&gt;
    number maxX, number maxY, number maxZ ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsSphereInView&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number radius ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInView&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number radius [, boolean checkIcons] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&#039;&#039;&#039;Spring.WorldToScreenCoords&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.TraceScreenRay&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseX, number mouseY [, boolean onlyCoords &lt;br /&gt;
  [, boolean useMinimap, [boolean includeSky]] ] )&lt;br /&gt;
    -&amp;gt; nil |&lt;br /&gt;
    string &amp;quot;unit&amp;quot;,    number unitID    |&lt;br /&gt;
    string &amp;quot;feature&amp;quot;, number featureID |&lt;br /&gt;
    string &amp;quot;ground&amp;quot;,  { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetViewGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number viewSizeX, number viewSizeY, number viewPosX, number viewPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWindowGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number winSizeX, number winSizeY, number winPosX, number winPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetScreenGeometry&#039;&#039;&#039; (is missing multiscreen support!)&lt;br /&gt;
  ( ) -&amp;gt; number screenSizeX, number screenSizeY, number ZERO, number ZERO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitViewPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean midPos = false ] ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransformMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean invert = false] ) -&amp;gt; nil | number a11, number a12 ..., number a44    &amp;lt;span class=note&amp;gt;(4x4 matrix)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = { [1] = [number unitID], etc...}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = number count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number count&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitSelected&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitGroup&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [number] = number unitCount,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedGroup&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIName&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; string aiName&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [1] = string aiName, ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = number unitID, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = {number unitID, ...}, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = number count, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGUIHidden&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveShadows&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveAdvShading&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWaterMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number mode, string &amp;quot;mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  mode numbers:&lt;br /&gt;
      0 - basic&lt;br /&gt;
      1 - reflective&lt;br /&gt;
      2 - dynamic&lt;br /&gt;
      3 - refractive&lt;br /&gt;
      4 - bumpwater&lt;br /&gt;
      default - unknown&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapDrawMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | &amp;quot;normal&amp;quot; | &amp;quot;height&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;pathTraversability&amp;quot; | &amp;quot;los&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit GUI States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoMinimap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number posX, number posY, number sizeX, number sizeY,&lt;br /&gt;
    boolean minimized, boolean maximized&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapDualScreen&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean false | string &amp;quot;left&amp;quot; | string &amp;quot;right&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAboveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDefaultCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number index ) -&amp;gt; nil | {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCmdDescIndex&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActivePage&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number pageNum, number maxPages&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGatherMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetInvertQueueKey&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number X, number Y,&lt;br /&gt;
    boolean leftPressed, boolean middlePressed, boolean rightPressed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseCursor&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string name, number scale&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseButton ) -&amp;gt; nil | number pressedX, number pressedY,&lt;br /&gt;
    number camPosX, number camPosY, number camPosZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean alt, boolean ctrl, boolean meta, boolean shift&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPressedKeys&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [number] = boolean,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyCode&#039;&#039;&#039;&lt;br /&gt;
  ( string keysym ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeySymbol&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; string &amp;quot;keysym1&amp;quot;, string &amp;quot;keysym2&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyBindings&#039;&#039;&#039;&lt;br /&gt;
  ( string keyset ) -&amp;gt; nil | { [1] = {[string actionCmd] = string actionExtra}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActionHotKeys&#039;&#039;&#039;&lt;br /&gt;
  ( string action ) -&amp;gt; nil | { [1] = string hotKey, ... }&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastMessagePositions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = { number X, number Y, number Z },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConsoleBuffer&#039;&#039;&#039;&lt;br /&gt;
  ( [number maxLines] ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      text = string,&lt;br /&gt;
      priority = number&lt;br /&gt;
   }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCurrentTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFPS&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number low 16bit, number high 16bit&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimeOffset&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastUpdateSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHasLag&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTimer&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&#039;&#039;&#039;Spring.DiffTimers&#039;&#039;&#039;&lt;br /&gt;
  ( timer cur, timer ago) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  (number texSqrX, number texSqrY, number texMipLvl, string luaTexName) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12530</id>
		<title>Lua camState</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12530"/>
		<updated>2012-10-26T16:48:05Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* TL;DR */ seems at least some of this info is only applicable to free cam&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TL;DR ==&lt;br /&gt;
&#039;&#039;&#039;px&#039;&#039;&#039;, &#039;&#039;&#039;py&#039;&#039;&#039; and &#039;&#039;&#039;pz&#039;&#039;&#039; are camera position in world coords.&lt;br /&gt;
&lt;br /&gt;
=== Free camera ===&lt;br /&gt;
&#039;&#039;&#039;rx&#039;&#039;&#039; and &#039;&#039;&#039;ry&#039;&#039;&#039; are camera rotation in radians about the X and Y axes respectively, where an rx of 0 is horizontal and an ry of 0 is facing south, positive values running anticlockwise. &#039;&#039;&#039;rz&#039;&#039;&#039; currently (91.0) does nothing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dx&#039;&#039;&#039;, &#039;&#039;&#039;dy&#039;&#039;&#039; and &#039;&#039;&#039;dz&#039;&#039;&#039; have &#039;&#039;nothing&#039;&#039; to do with camera rotation.&lt;br /&gt;
&lt;br /&gt;
== The raw info ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I wanted to use Spring.SetCameraState( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
The wiki said: camState has the same format as the output of Spring.GetCameraState().&lt;br /&gt;
&lt;br /&gt;
So I ran Spring.Echo(Spring.GetCameraState())&lt;br /&gt;
All I got was:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
TABLE: &lt;br /&gt;
&lt;br /&gt;
So, I ran, for every kind of camera:&lt;br /&gt;
for index,value in pairs(Spring.GetCameraState()) do&lt;br /&gt;
	Spring.Echo(index,value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
This is what I got:&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
name : &amp;quot;ta&amp;quot;&lt;br /&gt;
mode : 1&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position)&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
zscale: how tilted is the camera, from 10 (near horizontal) to 0.05 (near vertical). We have y/z = 1.0/zscale (with a -1 thrown in if flipped)&lt;br /&gt;
height : how much above the ground is the camera, cannot be negative -- &#039;&#039; it&#039;s absolute height of the camera, ie the camera positions y value, actually (so no difference if cam is above mountain or valley)~~~~&#039;&#039;&lt;br /&gt;
flipped : -1 for when south is down, 1 for when north is down&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 2000&lt;br /&gt;
py, 70&lt;br /&gt;
pz, 1800&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, 0&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Total War style camera&lt;br /&gt;
rz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
name, tw&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
px, 477.53298950195&lt;br /&gt;
py, 100&lt;br /&gt;
pz, 447.54751586914&lt;br /&gt;
mode, 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Rotatable overhead camera&lt;br /&gt;
name : &amp;quot;rot&amp;quot;&lt;br /&gt;
mode : 3&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position) -- &#039;&#039; actually it seems to be the camera position to me (I set the height with py, not so sure about the others...) ~~~~&#039;&#039;&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
rx,ry,rz : Camera rotation?&lt;br /&gt;
oldHeight : how much above the ground is the camera, cannot be negative, cannot be changed (I guess it&#039;s just in for when switching to a view that requires it next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 600&lt;br /&gt;
pz, 441.25302124023&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -4.9136563262664e-008&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, rot&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 3&lt;br /&gt;
dz, -0.56205677986145&lt;br /&gt;
oldHeight, 500&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Free style camera&lt;br /&gt;
avx, 0&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
gravity, -500&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
autoTilt, 2.6179938316345&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
py, 964.28167724609&lt;br /&gt;
gndOffset, 16&lt;br /&gt;
gndLock, -1&lt;br /&gt;
goForward, -1&lt;br /&gt;
mode, 4&lt;br /&gt;
tiltSpeed, 2.6179938316345&lt;br /&gt;
velTime, 1.5&lt;br /&gt;
slide, 0.5&lt;br /&gt;
avz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
invertAlt, -1&lt;br /&gt;
rz, 0&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
avy, 0&lt;br /&gt;
scrollSpeed, 100&lt;br /&gt;
name, free&lt;br /&gt;
fov, 45&lt;br /&gt;
vz, 0&lt;br /&gt;
avelTime, 1&lt;br /&gt;
vx, 0&lt;br /&gt;
vy, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Smooth style camera&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 109.49719238281&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, sm&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 5&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Orbit style camera&lt;br /&gt;
tx, 522.32415771484&lt;br /&gt;
ty, 241.19664001465&lt;br /&gt;
name, OrbitController&lt;br /&gt;
tz, 644.45776367188&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 556.63806152344&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
mode, 6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to FPS style camera&lt;br /&gt;
px, 1233.4810791016&lt;br /&gt;
py, 554.39453125&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, fps&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 0&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
oldHeight, 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
px, 1324.8835449219&lt;br /&gt;
py, 254.39453125&lt;br /&gt;
pz, 871.56591796875&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 713.52716064453&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
Now someone go comment that.&lt;br /&gt;
&lt;br /&gt;
It appears that mod eis simply a number containing the same information as name, but while name is a string, mode is an integer between 0 and 6.&lt;br /&gt;
&lt;br /&gt;
I guess px,py,pz could be the postion, while dx,dy,dz could be the direction?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But what is height? What is zscale? What is flipped? What is oldHeigh? What are rx,ry,rz? Why has orbit no dx,dy,dz but some tx,ty,tz? What about all the free style camera settings? If you know edit that page please!&lt;br /&gt;
&lt;br /&gt;
From testing, I found out flipped invert north/south depending on whether it&#039;s negative or positive.&lt;br /&gt;
&lt;br /&gt;
From testing, I found out zscale is how horizontal/vertical are some camera, 10 for almost horizontal TA overhead, 0.05 for almost vertical TA overhead.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12529</id>
		<title>Lua camState</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12529"/>
		<updated>2012-10-26T16:23:37Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* TL;DR */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TL;DR ==&lt;br /&gt;
&#039;&#039;&#039;px&#039;&#039;&#039;, &#039;&#039;&#039;py&#039;&#039;&#039; and &#039;&#039;&#039;pz&#039;&#039;&#039; are camera position in world coords.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rx&#039;&#039;&#039; and &#039;&#039;&#039;ry&#039;&#039;&#039; are camera rotation in radians about the X and Y axes respectively, where an rx of 0 is horizontal and an ry of 0 is facing south, positive values running anticlockwise. &#039;&#039;&#039;rz&#039;&#039;&#039; currently (91.0) does nothing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dx&#039;&#039;&#039;, &#039;&#039;&#039;dy&#039;&#039;&#039; and &#039;&#039;&#039;dz&#039;&#039;&#039; have &#039;&#039;nothing&#039;&#039; to do with camera rotation.&lt;br /&gt;
&lt;br /&gt;
== The raw info ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I wanted to use Spring.SetCameraState( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
The wiki said: camState has the same format as the output of Spring.GetCameraState().&lt;br /&gt;
&lt;br /&gt;
So I ran Spring.Echo(Spring.GetCameraState())&lt;br /&gt;
All I got was:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
TABLE: &lt;br /&gt;
&lt;br /&gt;
So, I ran, for every kind of camera:&lt;br /&gt;
for index,value in pairs(Spring.GetCameraState()) do&lt;br /&gt;
	Spring.Echo(index,value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
This is what I got:&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
name : &amp;quot;ta&amp;quot;&lt;br /&gt;
mode : 1&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position)&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
zscale: how tilted is the camera, from 10 (near horizontal) to 0.05 (near vertical). We have y/z = 1.0/zscale (with a -1 thrown in if flipped)&lt;br /&gt;
height : how much above the ground is the camera, cannot be negative -- &#039;&#039; it&#039;s absolute height of the camera, ie the camera positions y value, actually (so no difference if cam is above mountain or valley)~~~~&#039;&#039;&lt;br /&gt;
flipped : -1 for when south is down, 1 for when north is down&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 2000&lt;br /&gt;
py, 70&lt;br /&gt;
pz, 1800&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, 0&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Total War style camera&lt;br /&gt;
rz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
name, tw&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
px, 477.53298950195&lt;br /&gt;
py, 100&lt;br /&gt;
pz, 447.54751586914&lt;br /&gt;
mode, 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Rotatable overhead camera&lt;br /&gt;
name : &amp;quot;rot&amp;quot;&lt;br /&gt;
mode : 3&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position) -- &#039;&#039; actually it seems to be the camera position to me (I set the height with py, not so sure about the others...) ~~~~&#039;&#039;&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
rx,ry,rz : Camera rotation?&lt;br /&gt;
oldHeight : how much above the ground is the camera, cannot be negative, cannot be changed (I guess it&#039;s just in for when switching to a view that requires it next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 600&lt;br /&gt;
pz, 441.25302124023&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -4.9136563262664e-008&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, rot&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 3&lt;br /&gt;
dz, -0.56205677986145&lt;br /&gt;
oldHeight, 500&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Free style camera&lt;br /&gt;
avx, 0&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
gravity, -500&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
autoTilt, 2.6179938316345&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
py, 964.28167724609&lt;br /&gt;
gndOffset, 16&lt;br /&gt;
gndLock, -1&lt;br /&gt;
goForward, -1&lt;br /&gt;
mode, 4&lt;br /&gt;
tiltSpeed, 2.6179938316345&lt;br /&gt;
velTime, 1.5&lt;br /&gt;
slide, 0.5&lt;br /&gt;
avz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
invertAlt, -1&lt;br /&gt;
rz, 0&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
avy, 0&lt;br /&gt;
scrollSpeed, 100&lt;br /&gt;
name, free&lt;br /&gt;
fov, 45&lt;br /&gt;
vz, 0&lt;br /&gt;
avelTime, 1&lt;br /&gt;
vx, 0&lt;br /&gt;
vy, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Smooth style camera&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 109.49719238281&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, sm&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 5&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Orbit style camera&lt;br /&gt;
tx, 522.32415771484&lt;br /&gt;
ty, 241.19664001465&lt;br /&gt;
name, OrbitController&lt;br /&gt;
tz, 644.45776367188&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 556.63806152344&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
mode, 6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to FPS style camera&lt;br /&gt;
px, 1233.4810791016&lt;br /&gt;
py, 554.39453125&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, fps&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 0&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
oldHeight, 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
px, 1324.8835449219&lt;br /&gt;
py, 254.39453125&lt;br /&gt;
pz, 871.56591796875&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 713.52716064453&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
Now someone go comment that.&lt;br /&gt;
&lt;br /&gt;
It appears that mod eis simply a number containing the same information as name, but while name is a string, mode is an integer between 0 and 6.&lt;br /&gt;
&lt;br /&gt;
I guess px,py,pz could be the postion, while dx,dy,dz could be the direction?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But what is height? What is zscale? What is flipped? What is oldHeigh? What are rx,ry,rz? Why has orbit no dx,dy,dz but some tx,ty,tz? What about all the free style camera settings? If you know edit that page please!&lt;br /&gt;
&lt;br /&gt;
From testing, I found out flipped invert north/south depending on whether it&#039;s negative or positive.&lt;br /&gt;
&lt;br /&gt;
From testing, I found out zscale is how horizontal/vertical are some camera, 10 for almost horizontal TA overhead, 0.05 for almost vertical TA overhead.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12528</id>
		<title>Lua camState</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12528"/>
		<updated>2012-10-26T16:21:45Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* TL;DR */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TL;DR ==&lt;br /&gt;
&#039;&#039;&#039;px&#039;&#039;&#039;, &#039;&#039;&#039;py&#039;&#039;&#039; and &#039;&#039;&#039;pz&#039;&#039;&#039; are camera position in world coords.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rx&#039;&#039;&#039; and &#039;&#039;&#039;ry&#039;&#039;&#039; are camera rotation in radians about the X and Y axes respectively, where an rx of 0 is horizontal and an ry of 0 is facing south. &#039;&#039;&#039;rz&#039;&#039;&#039; currently (91.0) does nothing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dx&#039;&#039;&#039;, &#039;&#039;&#039;dy&#039;&#039;&#039; and &#039;&#039;&#039;dz&#039;&#039;&#039; have &#039;&#039;nothing&#039;&#039; to do with camera rotation.&lt;br /&gt;
&lt;br /&gt;
== The raw info ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I wanted to use Spring.SetCameraState( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
The wiki said: camState has the same format as the output of Spring.GetCameraState().&lt;br /&gt;
&lt;br /&gt;
So I ran Spring.Echo(Spring.GetCameraState())&lt;br /&gt;
All I got was:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
TABLE: &lt;br /&gt;
&lt;br /&gt;
So, I ran, for every kind of camera:&lt;br /&gt;
for index,value in pairs(Spring.GetCameraState()) do&lt;br /&gt;
	Spring.Echo(index,value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
This is what I got:&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
name : &amp;quot;ta&amp;quot;&lt;br /&gt;
mode : 1&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position)&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
zscale: how tilted is the camera, from 10 (near horizontal) to 0.05 (near vertical). We have y/z = 1.0/zscale (with a -1 thrown in if flipped)&lt;br /&gt;
height : how much above the ground is the camera, cannot be negative -- &#039;&#039; it&#039;s absolute height of the camera, ie the camera positions y value, actually (so no difference if cam is above mountain or valley)~~~~&#039;&#039;&lt;br /&gt;
flipped : -1 for when south is down, 1 for when north is down&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 2000&lt;br /&gt;
py, 70&lt;br /&gt;
pz, 1800&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, 0&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Total War style camera&lt;br /&gt;
rz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
name, tw&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
px, 477.53298950195&lt;br /&gt;
py, 100&lt;br /&gt;
pz, 447.54751586914&lt;br /&gt;
mode, 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Rotatable overhead camera&lt;br /&gt;
name : &amp;quot;rot&amp;quot;&lt;br /&gt;
mode : 3&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position) -- &#039;&#039; actually it seems to be the camera position to me (I set the height with py, not so sure about the others...) ~~~~&#039;&#039;&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
rx,ry,rz : Camera rotation?&lt;br /&gt;
oldHeight : how much above the ground is the camera, cannot be negative, cannot be changed (I guess it&#039;s just in for when switching to a view that requires it next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 600&lt;br /&gt;
pz, 441.25302124023&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -4.9136563262664e-008&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, rot&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 3&lt;br /&gt;
dz, -0.56205677986145&lt;br /&gt;
oldHeight, 500&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Free style camera&lt;br /&gt;
avx, 0&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
gravity, -500&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
autoTilt, 2.6179938316345&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
py, 964.28167724609&lt;br /&gt;
gndOffset, 16&lt;br /&gt;
gndLock, -1&lt;br /&gt;
goForward, -1&lt;br /&gt;
mode, 4&lt;br /&gt;
tiltSpeed, 2.6179938316345&lt;br /&gt;
velTime, 1.5&lt;br /&gt;
slide, 0.5&lt;br /&gt;
avz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
invertAlt, -1&lt;br /&gt;
rz, 0&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
avy, 0&lt;br /&gt;
scrollSpeed, 100&lt;br /&gt;
name, free&lt;br /&gt;
fov, 45&lt;br /&gt;
vz, 0&lt;br /&gt;
avelTime, 1&lt;br /&gt;
vx, 0&lt;br /&gt;
vy, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Smooth style camera&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 109.49719238281&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, sm&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 5&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Orbit style camera&lt;br /&gt;
tx, 522.32415771484&lt;br /&gt;
ty, 241.19664001465&lt;br /&gt;
name, OrbitController&lt;br /&gt;
tz, 644.45776367188&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 556.63806152344&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
mode, 6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to FPS style camera&lt;br /&gt;
px, 1233.4810791016&lt;br /&gt;
py, 554.39453125&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, fps&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 0&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
oldHeight, 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
px, 1324.8835449219&lt;br /&gt;
py, 254.39453125&lt;br /&gt;
pz, 871.56591796875&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 713.52716064453&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
Now someone go comment that.&lt;br /&gt;
&lt;br /&gt;
It appears that mod eis simply a number containing the same information as name, but while name is a string, mode is an integer between 0 and 6.&lt;br /&gt;
&lt;br /&gt;
I guess px,py,pz could be the postion, while dx,dy,dz could be the direction?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But what is height? What is zscale? What is flipped? What is oldHeigh? What are rx,ry,rz? Why has orbit no dx,dy,dz but some tx,ty,tz? What about all the free style camera settings? If you know edit that page please!&lt;br /&gt;
&lt;br /&gt;
From testing, I found out flipped invert north/south depending on whether it&#039;s negative or positive.&lt;br /&gt;
&lt;br /&gt;
From testing, I found out zscale is how horizontal/vertical are some camera, 10 for almost horizontal TA overhead, 0.05 for almost vertical TA overhead.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12527</id>
		<title>Lua camState</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_camState&amp;diff=12527"/>
		<updated>2012-10-26T16:20:56Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: A small amount of info gleaned from my testing.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TL;DR ==&lt;br /&gt;
&#039;&#039;&#039;px&#039;&#039;&#039;, &#039;&#039;&#039;py&#039;&#039;&#039; and &#039;&#039;&#039;pz&#039;&#039;&#039; are camera position in world coords.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rx&#039;&#039;&#039; and &#039;&#039;&#039;ry&#039;&#039;&#039; are camera rotation in radians about the X and Y axes respectively. &#039;&#039;&#039;rz&#039;&#039;&#039; currently (91.0) does nothing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dx&#039;&#039;&#039;, &#039;&#039;&#039;dy&#039;&#039;&#039; and &#039;&#039;&#039;dz&#039;&#039;&#039; have &#039;&#039;nothing&#039;&#039; to do with camera rotation.&lt;br /&gt;
&lt;br /&gt;
== The raw info ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I wanted to use Spring.SetCameraState( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
The wiki said: camState has the same format as the output of Spring.GetCameraState().&lt;br /&gt;
&lt;br /&gt;
So I ran Spring.Echo(Spring.GetCameraState())&lt;br /&gt;
All I got was:&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
TABLE: &lt;br /&gt;
&lt;br /&gt;
So, I ran, for every kind of camera:&lt;br /&gt;
for index,value in pairs(Spring.GetCameraState()) do&lt;br /&gt;
	Spring.Echo(index,value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
This is what I got:&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
name : &amp;quot;ta&amp;quot;&lt;br /&gt;
mode : 1&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position)&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
zscale: how tilted is the camera, from 10 (near horizontal) to 0.05 (near vertical). We have y/z = 1.0/zscale (with a -1 thrown in if flipped)&lt;br /&gt;
height : how much above the ground is the camera, cannot be negative -- &#039;&#039; it&#039;s absolute height of the camera, ie the camera positions y value, actually (so no difference if cam is above mountain or valley)~~~~&#039;&#039;&lt;br /&gt;
flipped : -1 for when south is down, 1 for when north is down&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 2000&lt;br /&gt;
py, 70&lt;br /&gt;
pz, 1800&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, 0&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Total War style camera&lt;br /&gt;
rz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
name, tw&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
px, 477.53298950195&lt;br /&gt;
py, 100&lt;br /&gt;
pz, 447.54751586914&lt;br /&gt;
mode, 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Rotatable overhead camera&lt;br /&gt;
name : &amp;quot;rot&amp;quot;&lt;br /&gt;
mode : 3&lt;br /&gt;
px,py,pz : Position of the ground point in screen center (not camera position) -- &#039;&#039; actually it seems to be the camera position to me (I set the height with py, not so sure about the others...) ~~~~&#039;&#039;&lt;br /&gt;
dx,dy,dz : Camera direction vector?&lt;br /&gt;
rx,ry,rz : Camera rotation?&lt;br /&gt;
oldHeight : how much above the ground is the camera, cannot be negative, cannot be changed (I guess it&#039;s just in for when switching to a view that requires it next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exemple:&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 600&lt;br /&gt;
pz, 441.25302124023&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -4.9136563262664e-008&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, rot&lt;br /&gt;
ry, 3.1415927410126&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 3&lt;br /&gt;
dz, -0.56205677986145&lt;br /&gt;
oldHeight, 500&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Free style camera&lt;br /&gt;
avx, 0&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
gravity, -500&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
autoTilt, 2.6179938316345&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
py, 964.28167724609&lt;br /&gt;
gndOffset, 16&lt;br /&gt;
gndLock, -1&lt;br /&gt;
goForward, -1&lt;br /&gt;
mode, 4&lt;br /&gt;
tiltSpeed, 2.6179938316345&lt;br /&gt;
velTime, 1.5&lt;br /&gt;
slide, 0.5&lt;br /&gt;
avz, 0&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
invertAlt, -1&lt;br /&gt;
rz, 0&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
avy, 0&lt;br /&gt;
scrollSpeed, 100&lt;br /&gt;
name, free&lt;br /&gt;
fov, 45&lt;br /&gt;
vz, 0&lt;br /&gt;
avelTime, 1&lt;br /&gt;
vx, 0&lt;br /&gt;
vy, 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Smooth style camera&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 109.49719238281&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, sm&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 500&lt;br /&gt;
mode, 5&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Orbit style camera&lt;br /&gt;
tx, 522.32415771484&lt;br /&gt;
ty, 241.19664001465&lt;br /&gt;
name, OrbitController&lt;br /&gt;
tz, 644.45776367188&lt;br /&gt;
px, 522.32415771484&lt;br /&gt;
py, 556.63806152344&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
mode, 6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to FPS style camera&lt;br /&gt;
px, 1233.4810791016&lt;br /&gt;
py, 554.39453125&lt;br /&gt;
pz, 873.39385986328&lt;br /&gt;
rz, 0&lt;br /&gt;
dx, -0.011240424588323&lt;br /&gt;
dy, -0.82505232095718&lt;br /&gt;
name, fps&lt;br /&gt;
ry, 3.1615927219391&lt;br /&gt;
rx, -0.9727737903595&lt;br /&gt;
mode, 0&lt;br /&gt;
dz, -0.5619443655014&lt;br /&gt;
oldHeight, 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switching to Overhead (TA) style camera&lt;br /&gt;
px, 1324.8835449219&lt;br /&gt;
py, 254.39453125&lt;br /&gt;
pz, 871.56591796875&lt;br /&gt;
flipped, -1&lt;br /&gt;
dy, -0.89428168535233&lt;br /&gt;
name, ta&lt;br /&gt;
zscale, 0.5&lt;br /&gt;
height, 713.52716064453&lt;br /&gt;
mode, 1&lt;br /&gt;
dx, 0&lt;br /&gt;
dz, -0.44714084267616&lt;br /&gt;
&lt;br /&gt;
Now someone go comment that.&lt;br /&gt;
&lt;br /&gt;
It appears that mod eis simply a number containing the same information as name, but while name is a string, mode is an integer between 0 and 6.&lt;br /&gt;
&lt;br /&gt;
I guess px,py,pz could be the postion, while dx,dy,dz could be the direction?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But what is height? What is zscale? What is flipped? What is oldHeigh? What are rx,ry,rz? Why has orbit no dx,dy,dz but some tx,ty,tz? What about all the free style camera settings? If you know edit that page please!&lt;br /&gt;
&lt;br /&gt;
From testing, I found out flipped invert north/south depending on whether it&#039;s negative or positive.&lt;br /&gt;
&lt;br /&gt;
From testing, I found out zscale is how horizontal/vertical are some camera, 10 for almost horizontal TA overhead, 0.05 for almost vertical TA overhead.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12263</id>
		<title>Lua UnsyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12263"/>
		<updated>2012-01-24T04:34:27Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Multiple sound streams can be played at once&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Entries below marked &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt; require the setting ModUICtrl to be enabled in the users [[springrc]], if you want to use them in unsynced LuaRules/LuaGaia. It is enabled by default so you generally don&#039;t need to care.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= UI =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLastMessagePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Ingame Console =&lt;br /&gt;
&#039;&#039;&#039;Spring.Echo&#039;&#039;&#039;&lt;br /&gt;
  ( arg1 [, arg2 [, ... ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Useful for debugging.&amp;lt;br&amp;gt; Prints values in the spring chat console.&amp;lt;br&amp;gt; Hint: the default print() writes to STDOUT.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SendCommands&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string command1 [, string command2 [ ... ] ] ) -&amp;gt; nil&lt;br /&gt;
  ( {string command1, string command2, ...} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetActiveCommand&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string action [, string actionExtra ] ) -&amp;gt; nil | boolean&lt;br /&gt;
  ( number cmdIndex [, number button = 1&lt;br /&gt;
    [, boolean leftClick, boolean rightClick,&lt;br /&gt;
     boolean alt, boolean ctrl, boolean meta, boolean shift]] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ForceLayoutUpdate&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;disables the &amp;quot;Selected Units x&amp;quot; box in the GUI&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Mouse ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMouseCursor&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string cursorName [, number scale ] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.WarpMouse&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== LOS Colors ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLosViewColors&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( table reds = { number always, number LOS, number radar, number jam }, &lt;br /&gt;
    table greens = { number always, number LOS, number radar, number jam },&lt;br /&gt;
    table blues = { number always, number LOS, number radar, number jam } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== SendMessage ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessage&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToPlayer&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToSpectators&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
Funfact:&lt;br /&gt;
&amp;lt;PLAYER#&amp;gt; (with # being a playerid) inside the string will be replaced with the players name.&lt;br /&gt;
ie&lt;br /&gt;
Spring.SendMessage (&amp;quot;&amp;lt;PLAYER1&amp;gt; did something&amp;quot;)&lt;br /&gt;
might display as &amp;quot;ProRusher did something&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerAddPoint&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, string text = &amp;quot;&amp;quot;] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerAddLine&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number y1, number z1, number x2, number y2, number z2 ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerErasePosition&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
&#039;&#039;&#039;Spring.LoadSoundDef&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;soundfile&amp;quot; ) -&amp;gt; nil | boolean success&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Loads a SoundDefs file, the format is the same as in `gamedata/sounds.lua`.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PlaySoundFile&#039;&#039;&#039;  &amp;lt;span class=note&amp;gt;Plays WAV or OGG sounds.&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;soundfile&amp;quot; [, number volume = 1.0&lt;br /&gt;
    [, number posx, number posy, number posz &lt;br /&gt;
    [, number speedx, number speedy, number speedz ] ] ], [string/number &amp;lt;span class=note&amp;gt;channel&amp;lt;/span&amp;gt; ] ) -&amp;gt; nil | boolean&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`channel` is new in Spring0.83, and can be one of those:&lt;br /&gt;
    &amp;quot;general&amp;quot; || 0 || nil (default)&lt;br /&gt;
    &amp;quot;battle&amp;quot; || &amp;quot;sfx&amp;quot; | 1&lt;br /&gt;
    &amp;quot;unitreply&amp;quot; || &amp;quot;voice&amp;quot; || 2&lt;br /&gt;
    &amp;quot;userinterface&amp;quot; || &amp;quot;ui&amp;quot; || 3&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PlaySoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;oggfile&amp;quot; [, number volume = 1.0&lt;br /&gt;
    [, number x, number y, number z ]] ) -&amp;gt; nil | boolean true&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Allow you to play an Ogg Vorbis (.OGG) compressed sound file.&amp;lt;br&amp;gt; In 83.0 and up multiple sound streams may be played at once &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.StopSoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Terminates any SoundStream currently running.&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.PauseSoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSoundStreamVolume&#039;&#039;&#039;&lt;br /&gt;
  ( number volume ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= SendLuaMessage =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Very important! (allows synced inter-lua-enviroment communications)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaUIMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message, string mode ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible modes are:&amp;lt;br&amp;gt;&amp;quot;s&amp;quot;/&amp;quot;specs&amp;quot; &amp;amp; &amp;quot;a&amp;quot;/&amp;quot;allies&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaGaiaMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaRulesMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Units =&lt;br /&gt;
== Unit Selection ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( { [unitID] = anything, ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( { [1] = unitID1 , [2] = unitID2 , ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSelectionInfo&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSelectionInfo ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Group ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitGroup&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number groupID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Give Order ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrder&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;gives order to all selected units&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&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 | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&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 | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&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 | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&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 | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&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;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&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;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Facing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Spacing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit NoDraw,NoSelect,NoMinimap ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoDraw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noDraw ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoSelect&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoMinimap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noMinimap ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSky&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSky ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawWater&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawWater ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawGround&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawGround ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWaterParams&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs cheating enabled!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Allows to change water params (mostly BumpWater ones) at runtime. You may want to set BumpWaterUseUniforms in your [[springrc]] to 1, then you don&#039;t even need to restart BumpWater via `/water 4`.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`params` table may contain:&lt;br /&gt;
  params = {&lt;br /&gt;
    absorb = {number r, number g, number b},&lt;br /&gt;
    baseColor = {number r, number g, number b},&lt;br /&gt;
    minColor = {number r, number g, number b},&lt;br /&gt;
    surfaceColor = {number r, number g, number b},&lt;br /&gt;
    diffuseColor = {number r, number g, number b},&lt;br /&gt;
    specularColor = {number r, number g, number b},&lt;br /&gt;
    planeColor = {number r, number g, number b},&lt;br /&gt;
    texture = string file,&lt;br /&gt;
    foamTexture = string file,&lt;br /&gt;
    normalTexture = string file,&lt;br /&gt;
    damage = number value,&lt;br /&gt;
    repeatX = number value,&lt;br /&gt;
    repeatY = number value,&lt;br /&gt;
    surfaceAlpha = number value,&lt;br /&gt;
    ambientFactor = number value,&lt;br /&gt;
    diffuseFactor = number value,&lt;br /&gt;
    specularFactor = number value,&lt;br /&gt;
    specularPower = number value,&lt;br /&gt;
    fresnelMin = number value,&lt;br /&gt;
    fresnelMax = number value,&lt;br /&gt;
    fresnelPower = number value,&lt;br /&gt;
    reflectionDistortion = number value,&lt;br /&gt;
    blurBase = number value,&lt;br /&gt;
    blurExponent = number value,&lt;br /&gt;
    perlinStartFreq = number value,&lt;br /&gt;
    perlinLacunarity = number value,&lt;br /&gt;
    perlinAmplitude = number value,&lt;br /&gt;
    numTiles = number value,&lt;br /&gt;
    shoreWaves = boolean value,&lt;br /&gt;
    forceRendering = boolean value,&lt;br /&gt;
    hasWaterPlane = boolean value,&lt;br /&gt;
  }&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
&#039;&#039;&#039;Spring.DrawUnitCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
  ( { [1] = unitID, ... } [, false ] ) -&amp;gt; nil&lt;br /&gt;
  ( { [unitID] = anything, ... }, true  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number r, number g, number b ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AssignMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;changes/creates the cursor of a single CursorCmd&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;cmdName&amp;quot;, string &amp;quot;iconFileName&amp;quot;&lt;br /&gt;
    [, boolean overwrite = true [, boolean hotSpotTopLeft = false] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font class=note&amp;gt;Note, that iconFileName is not the full filename instead it is like this:&lt;br /&gt;
  filename: Anims/cursorattack_0.bmp&lt;br /&gt;
  iconFileName: cursorattack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ReplaceMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;mass replace all occurrence of the cursor in all CursorCmds&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;oldFileName&amp;quot;, string &amp;quot;newFileName&amp;quot; [, boolean hotSpotTopLeft = false] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCustomCommandDrawData&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;register your custom cmd so it gets visible in the unit&#039;s cmd queue&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number cmdID,&lt;br /&gt;
    number cmdIconID | string iconname | nil,&lt;br /&gt;
    { number r, number g, number b, number a } [, boolean showArea ] ) -&amp;gt; nil | true&lt;br /&gt;
&lt;br /&gt;
= Sharing =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetShareLevel&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: shareLevel is 0&amp;lt;= x &amp;lt;= 1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number shareLevel ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.ShareResources&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number teamID, string &amp;quot;units&amp;quot; ) -&amp;gt; nil&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;
= UnitDef RadarIcons &amp;amp; BuildPics =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName, string texFile [, number size [, number dist [, boolean radAdjust ]]] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FreeUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefIcon&#039;&#039;&#039;  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(RadarIcon)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, string iconName ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefImage&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(BuildPic)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, luaTexture | string texFile ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Camera =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;camState has the same format as the output of Spring.GetCameraState(). See [[Lua_camState]] for details about camState.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number y [,number transTime] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;For Spring Engine XZ represents horizontal, from north west corner of map and Y vertical, from water level and rising.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraOffset&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( [number px = 0 [, number py = 0 [, number pz = 0&lt;br /&gt;
     [, number tx = 0 [, number ty = 0 [, number tz = 0]]]]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= (Virtual-)FileSystem =&lt;br /&gt;
&#039;&#039;&#039;Spring.ExtractModArchiveFile&#039;&#039;&#039;&lt;br /&gt;
  ( string modfile ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateDir&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number path ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
= Engine Config =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;The following functions read the engine configs saved in [[springrc]], a version-ed instance of these or a custom file supplied on the command line.&lt;br /&gt;
If &#039;&#039;*Overlay&#039;&#039; is &#039;&#039;true&#039;&#039;, the value will only be set in memory, and not be restored for the next game&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigInt&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string name [, number default [, boolean setInOverlay = false]] ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigInt&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string name, number value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigString&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string name [, string default [, boolean setInOverlay = false]] ) -&amp;gt; nil | string&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigString&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string name, string value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= World Primitives =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;outdated! use opengl api instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldText&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot;, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID,&lt;br /&gt;
    number x, number y, number z,&lt;br /&gt;
    number team, number facing) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Restart&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(0.79+)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string commandline_args, string startscript )&lt;br /&gt;
    -&amp;gt; if this call returns, something went wrong&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;commandline_args&#039;&#039; are commandline arguments passed to spring executable&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;start-script is the CONTENT of the script.txt spring should use to start (if empty, no start-script is added, you can still point spring to your custom script.txt when you add the file-path to &#039;&#039;commandline_args&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMIcon&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(0.83+)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string iconFileName ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the icon for the process which is seen in the OS task-bar and other places (default: spring-logo).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: has to be 24bit or 32bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: on windows, it has to be 32x32 pixels in size (recommended for cross-platform)&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.bmp&#039;&#039; images have to be in BGR format (default for m$ ones).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.ico&#039;&#039; images are not supported.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMCaption&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(0.83+)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string title [, string titleShort = title ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the window &#039;&#039;title&#039;&#039; for the process (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;The &#039;&#039;shortTitle&#039;&#039; is displayed in the OS task-bar (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; &#039;&#039;shortTitle&#039;&#039; is only ever possibly used under X11 (Linux &amp;amp; OS X), but not with QT (KDE) and never under Windows. See [http://www.gpwiki.org/index.php/SDL:Tutorials:Initializing_SDL_Libraries#About_the_icon_.28.22Icon_Title.22.29_parameter_on_different_window-managers this site] for more details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Rendering =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;NOTE: these (0.83+) lighting callouts only work when called from unsynced gadgets!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddMapLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicMapLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&#039;&#039;&#039;Spring.AddModelLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicModelLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateMapLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateModelLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.SetModelLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;lightParams&#039;&#039;&#039; is a table that should contain at least one of the following recognized key/value pairs:&lt;br /&gt;
&lt;br /&gt;
    lightParams = {&lt;br /&gt;
        position = {px, py, pz},&lt;br /&gt;
        direction = {dx, dy, dz},&lt;br /&gt;
        ambientColor = {red, green, blue},&lt;br /&gt;
        diffuseColor = {red, green, blue},&lt;br /&gt;
        specularColor = {red, green, blue},&lt;br /&gt;
        intensityWeight = {ambientWeight, diffuseWeight, specularWeight},&lt;br /&gt;
&lt;br /&gt;
        -- per-frame decay of ambientColor (spread over TTL frames)&lt;br /&gt;
        ambientDecayRate = {ambientRedDecay, ambientGreenDecay, ambientBlueDecay},&lt;br /&gt;
        -- per-frame decay of diffuseColor (spread over TTL frames)&lt;br /&gt;
        diffuseDecayRate = {diffuseRedDecay, diffuseGreenDecay, diffuseBlueDecay},&lt;br /&gt;
        -- per-frame decay of specularColor (spread over TTL frames)&lt;br /&gt;
        specularDecayRate = {specularRedDecay, specularGreenDecay, specularBlueDecay},&lt;br /&gt;
        -- *DecayType = 0.0 -&amp;gt; interpret *DecayRate values as linear, else as exponential&lt;br /&gt;
        decayFunctionType = {ambientDecayType, diffuseDecayType, specularDecayType},&lt;br /&gt;
&lt;br /&gt;
        radius = number elmos,&lt;br /&gt;
        fov = number degrees,&lt;br /&gt;
        ttl = number frames,&lt;br /&gt;
        priority = number,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  (number texSqrX, number texSqrY, string luaTexName) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  (number texSqrX, number texSqrY, number texMipLvl, string luaTexName) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:CollisionVolumes&amp;diff=8174</id>
		<title>Gamedev:CollisionVolumes</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:CollisionVolumes&amp;diff=8174"/>
		<updated>2011-05-14T07:32:48Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Some refinements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What is a collision volume?==&lt;br /&gt;
The collision volume is a geometric shape around (almost) all Spring units.&lt;br /&gt;
If a projectile collides with this shape, the engine registers it as a hit.&lt;br /&gt;
Other names are hitbox, hitsphere etc.&lt;br /&gt;
&lt;br /&gt;
http://springrts.com/mediawiki/images/0/06/Units_with_hitboxes.jpg&lt;br /&gt;
&lt;br /&gt;
==How to see them ingame==&lt;br /&gt;
Press ctrl + b and look at the black wireframe shapes around units.&lt;br /&gt;
If you can not see them, the collision volume might be blocked from view by the 3D model or be very offset like underground or in the sky.&lt;br /&gt;
Red shapes indicate the unit was hit.&lt;br /&gt;
&lt;br /&gt;
==What else are they used for?==&lt;br /&gt;
*collision between units&lt;br /&gt;
*when selecting units, where you have to click&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;???&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How to edit their shape==&lt;br /&gt;
===What are they measured in?===&lt;br /&gt;
[http://answers.springlobby.info/questions/339/dimension-of-spring in elmos.]&lt;br /&gt;
===In Upspring===&lt;br /&gt;
in the 3D view, click on the blue &amp;quot;3D&amp;quot; text and a menu opens.&amp;lt;br&amp;gt;&lt;br /&gt;
Click &amp;quot;draw model radius + height&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
At the right side, go to the &amp;quot;Model&amp;quot; tab and edit the values.&amp;lt;br&amp;gt;&lt;br /&gt;
With Upspring, you can only define sphere shaped collision volumes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
editing_hitbox_in_upspring.jpg&lt;br /&gt;
&lt;br /&gt;
===in the UnitDef===&lt;br /&gt;
There are numerous [http://springrts.com/wiki/Units:FBI tags] that controll shape, size, position of the collision volume.&lt;br /&gt;
You have to restart spring.exe for the changes to take effect, there is no way to reload unitdefs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;collisionVolumeOffsets = [[0 0 0]],&amp;lt;/pre&amp;gt;&amp;lt;br&amp;gt;position of the collision volume, in this example center of the unit. The value is relative to the unit center set in Upspring.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;collisionVolumeType = [[box]],&amp;lt;/pre&amp;gt;&lt;br /&gt;
defines the shape. possible are: &#039;&#039;box&#039;&#039;, &#039;&#039;ellipsoid&#039;&#039; and cylinders:&lt;br /&gt;
&#039;&#039;CylX&#039;&#039;, &#039;&#039;CylY&#039;&#039;, &#039;&#039;CylZ&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;collisionVolumeScales = =  [[40 20 55]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
dimensions along X Y Z axes.&lt;br /&gt;
&lt;br /&gt;
====boxxy the hitbox editor====&lt;br /&gt;
This creation allows you move hitboxes by pressing buttons.&lt;br /&gt;
This way you can get the needed numbers and copy them to the unitdef file.&lt;br /&gt;
&lt;br /&gt;
http://h-4.abload.de/img/loveandtrolls25t5u.gif&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=24882 forum thread]&lt;br /&gt;
&lt;br /&gt;
===Multiple collision volumes===&lt;br /&gt;
A unit can have multiple collision volumes. For example a tank could use a box for the chasis and a cylinder for the turret.&lt;br /&gt;
&lt;br /&gt;
Each piece can have its own collision volume. &amp;lt;pre&amp;gt;usePieceCollisionVolumes = true,&amp;lt;/pre&amp;gt; will cause each piece on the model to have an autogenerated hitvolume; unwanted hitvolumes can then be removed with Lua.&lt;br /&gt;
&lt;br /&gt;
==Can they be changed during gameplay?==&lt;br /&gt;
Yes. One example would be &amp;quot;pop up&amp;quot; turrets that get a smaller hitbox when sunken into the ground etc.&lt;br /&gt;
See &amp;lt;code&amp;gt;Spring.SetUnitCollisionVolumeData()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Spring.SetUnitPieceCollisionVolumeData()&amp;lt;/code&amp;gt;&lt;br /&gt;
at [[Lua_SyncedCtrl]]&lt;br /&gt;
There seems to be no noticeable cpu usage when dynamically adjusting collision volumes.&lt;br /&gt;
&lt;br /&gt;
==CPU Usage of non-sphere volumes==&lt;br /&gt;
For the engine, collision with a sphere are fastest to calculate. Cylinders and boxes require more math and so are slower.&lt;br /&gt;
How much does it really matter? No idea.&lt;br /&gt;
&lt;br /&gt;
==Unit radius &amp;amp; height VS collision volume==&lt;br /&gt;
When a unit uses a box volume, is the unit radius that was set in Upspring used for &#039;&#039;anything?&#039;&#039;&lt;br /&gt;
Unit-Unit collision? Selecting?&lt;br /&gt;
&lt;br /&gt;
==Which spot on an enemy do units target==&lt;br /&gt;
The model center set in Upspring&lt;br /&gt;
&lt;br /&gt;
==Common problems (and how to solve)==&lt;br /&gt;
===weapons miss the unit===&lt;br /&gt;
Weapons like Dgun and torpedos might pass through under the unit if the hitvolume does not extend a bit into the ground/underwater.&lt;br /&gt;
&lt;br /&gt;
===Intersecting hitboxes===&lt;br /&gt;
Two near units might refuse to shoot if their turrets intersect with each other&#039;s hitboxes.&lt;br /&gt;
&lt;br /&gt;
===Fast projectiles passing through collision volumes===&lt;br /&gt;
The problem: fast projectiles sometimes fly through small hit volumes without causing damage:&lt;br /&gt;
http://h-3.abload.de/img/screenshot_xta_spring_2gmr.jpg&lt;br /&gt;
The solution: &amp;lt;code&amp;gt;collisionVolumeTest = true,&amp;lt;/code&amp;gt; in the unitDef and hits will register correctlu.&lt;br /&gt;
&lt;br /&gt;
==Hitbox related weapon tags==&lt;br /&gt;
&amp;lt;pre&amp;gt;targetBorder = 1,&amp;lt;/pre&amp;gt; unit targets the border of the hit volume instead of its center.&lt;br /&gt;
only works on hitspheres: http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18824&amp;amp;p=352456&amp;amp;hilit=targetborder#p352456 (???)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;others???&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Aircraft==&lt;br /&gt;
The hitspheres of airplanes seem to be scaled down -50% by the engine.&lt;br /&gt;
&lt;br /&gt;
==Engine code==&lt;br /&gt;
related engine parts are:&lt;br /&gt;
1 ...&lt;br /&gt;
2 ...&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
[[Category:Unit development]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_OpenGL_Api&amp;diff=11484</id>
		<title>Lua OpenGL Api</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_OpenGL_Api&amp;diff=11484"/>
		<updated>2011-04-01T05:12:55Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* LineWidth &amp;amp; PointSize */  Added ATI warning for pointsize&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&#039;&#039;&#039;gl.GetSun&#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;font style=&amp;quot;font-size:90%&amp;quot;&amp;gt;()        -&amp;gt; number sunPosX, number sunPosY, number sunPosZ&lt;br /&gt;
  ( &amp;quot;pos&amp;quot; ) -&amp;gt; number sunPosX, number sunPosY, number sunPosZ&lt;br /&gt;
  ( &amp;quot;shadowDensity&amp;quot; [, &amp;quot;unit&amp;quot;] ) -&amp;gt; number shadowDensity&lt;br /&gt;
  ( &amp;quot;diffuse&amp;quot;       [, &amp;quot;unit&amp;quot;] ) -&amp;gt; nil | number r, number g, number b&lt;br /&gt;
  ( &amp;quot;ambient&amp;quot;       [, &amp;quot;unit&amp;quot;] ) -&amp;gt; nil | number r, number g, number b&lt;br /&gt;
  ( &amp;quot;specular&amp;quot; )                 -&amp;gt; nil | number r, number g, number b&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ConfigScreen&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;used for Unit LODs&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number screenWidth, number screenDistance ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawMiniMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;argument new in 0.82+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;boolean tansform = true&amp;lt;/span&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SlaveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( boolean mode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ConfigMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( int px, int py, int sx, int sy ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetViewSizes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number x, number y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&#039;&#039;&#039;gl.Viewport&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushMatrix&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PopMatrix&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;gl.Translate&#039;&#039;&#039;&lt;br /&gt;
  (number x, number y, number z) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Scale&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Rotate&#039;&#039;&#039;&lt;br /&gt;
  ( number angle, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Billboard&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/span &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MatrixMode&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#MatrixMode|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LoadIdentity&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LoadMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( ?? ) -&amp;gt; ??&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Ortho&#039;&#039;&#039;&lt;br /&gt;
  ( number left, number right, number bottom, number top, number near, number far ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Frustum&#039;&#039;&#039;&lt;br /&gt;
  ( number left, number right, number bottom, number top, number near, number far ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushPopMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( ?? ) -&amp;gt; ??&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ClipPlane&#039;&#039;&#039;&lt;br /&gt;
  ( int plane, &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: $plane can only be 1 or 2&amp;lt;/font&amp;gt;&lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number A, number B, number C, number D ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&#039;&#039;&#039;gl.Clear&#039;&#039;&#039;&lt;br /&gt;
  ( GL.DEPTH_BUFFER_BIT [, number cleardepth] ) -&amp;gt; nil&lt;br /&gt;
  ( GL.STENCIL_BUFFER_BIT [, int clearstencil] ) -&amp;gt; nil&lt;br /&gt;
  ( GL.COLOR_BUFFER_BIT | GL.ACCUM_BUFFER_BIT [, number r, number g, number b, number a] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&#039;&#039;&#039;gl.ResetState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;DON&#039;T USE IT AS LONG AS YOU KNOW WHAT YOU ARE DOING! each callin has different default states, but this function resets all states no matter what to the states below!&amp;lt;/span&amp;gt;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  ShadeModel = GL_SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL_LEQUAL)&lt;br /&gt;
  Culling    = false  (GL_BACK)&lt;br /&gt;
  LogicOp    = false  (GL_INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL_GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ResetMatrices&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  Resets GL_TEXTURE matrix stack&lt;br /&gt;
  Resets GL_MODELVIEW matrix stack&lt;br /&gt;
  Resets GL_PROJECTION matrix stack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&#039;&#039;&#039;gl.BeginEnd&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Drawing_Primitives|GLType]], function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Color&#039;&#039;&#039;&lt;br /&gt;
  ( { number r, number g, number b[, number a] } |&lt;br /&gt;
      number r, number g, number b[, number a] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Vertex&#039;&#039;&#039;&lt;br /&gt;
  ( { number x, number y [, number z [, number w ]] } |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Normal&#039;&#039;&#039;&lt;br /&gt;
  (  number x, number y, number z |&lt;br /&gt;
   { number x, number y, number z } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.EdgeFlag&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Rect&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number y1, number x2, number y2 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexRect&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;texture rect&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number y1, number x2, number y2,&lt;br /&gt;
  [ boolean flip_s, boolean flip_t | number s1, number t1, number s2, number t2 ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Shape&#039;&#039;&#039;&lt;br /&gt;
 ( number [[Lua_ConstGL#Drawing_Primitives|GLtype]],&lt;br /&gt;
   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&lt;br /&gt;
 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SecondaryColor&#039;&#039;&#039;&lt;br /&gt;
  ( { number r, number g, number b } |&lt;br /&gt;
      number r, number g, number b ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FogCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number value ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateList&#039;&#039;&#039;&lt;br /&gt;
  ( function [,arg1 [,arg2...]] ) -&amp;gt; number listID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CallList&#039;&#039;&#039;&lt;br /&gt;
  ( number listID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteList&#039;&#039;&#039;&lt;br /&gt;
  ( number listID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&#039;&#039;&#039;gl.Text&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;, number x, number y, number size [, string &amp;lt;span class=note&amp;gt;&amp;quot;options&amp;quot;&amp;lt;/span&amp;gt;] )&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
http://home.arcor.de/jkei/fontlines.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextWidth&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;) -&amp;gt; number width  &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextHeight&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot; ) -&amp;gt; nil | number height, number descender, number numlines &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;further descriptions here: [[GetTextHeight]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&amp;lt;b&amp;gt;If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;gl.BeginText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.EndText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&#039;&#039;&#039;gl.Unit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws an unit; on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitRaw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true )&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShape&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Feature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShape&#039;&#039;&#039;&lt;br /&gt;
  ( number featureDefID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(world space -&amp;gt; unit space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(unit space -&amp;gt; piece space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPiece&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws the unit piece)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(use gl.UnitPieceMultMatrix instead!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawListAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number listID, [ boolean midPos,&lt;br /&gt;
      number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
      number degrees, number rotX, number rotX, number rotZ ] ) -&amp;gt; nil &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawFuncAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean midPos, function [, arg1,... ]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&#039;&#039;&#039;gl.Blending&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
  ( string &amp;lt;span class=note&amp;gt;mode&amp;lt;/span&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99&amp;quot; | mode maybe:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL_ONE, GL_ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL_SRC_ALPHA, GL_ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;reset&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;color&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;modulate&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL_DST_COLOR, GL_ZERO&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;disable&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquation&#039;&#039;&#039;&lt;br /&gt;
  ( number mode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquationSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number modeRGB, number modeAlpha ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcRGB]], number [[Lua_ConstGL#BlendingFactorDest|dstRGB]],  number [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]], number [[Lua_ConstGL#BlendingFactorDest|dstAlpha]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.AlphaTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]], number threshold ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Culling&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#Culling|face]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthClamp&#039;&#039;&#039;  &amp;lt;span class=warning&amp;gt;not always available, needs GL_NV_depth_clamp!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ColorMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( boolean r, boolean g, boolean b, boolean a ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LogicOp&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#LogicOp|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Fog&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Smoothing&#039;&#039;&#039;&lt;br /&gt;
 ( (boolean enable | number POINT), &lt;br /&gt;
   (boolean enable | number LINE),&lt;br /&gt;
   (boolean enable | number POLYGON) ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.EdgeFlag&#039;&#039;&#039;&lt;br /&gt;
 ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Scissor&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( int x, int y, int w, int h ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LineStipple&#039;&#039;&#039;&lt;br /&gt;
  ( string any ) -&amp;gt; nil &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(use springs default line stipple)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
  ( int factor, number pattern ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonMode&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number [[Lua_ConstGL#PolygonMode|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonOffset&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number factor, number units ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushAttrib&#039;&#039;&#039;&lt;br /&gt;
  ( [ number [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PopAttrib&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&#039;&#039;&#039;gl.StencilTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMask&#039;&#039;&#039;&lt;br /&gt;
  ( number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOp&#039;&#039;&#039;&lt;br /&gt;
  ( number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMaskSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOpSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&#039;&#039;&#039;gl.LineWidth&#039;&#039;&#039;&lt;br /&gt;
  ( number width ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSize&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number size ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSprite&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable, [boolean coord_replace, boolean coord_origin_upper] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointParameter&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number v1, number v2, number v3, &lt;br /&gt;
    [ number sizeMin, number sizeMax, number sizeFade ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&#039;&#039;&#039;gl.Texture&#039;&#039;&#039;&lt;br /&gt;
  ( [ number texNum, ] boolean enable | string &amp;lt;span class=note&amp;gt;name&amp;lt;/span&amp;gt; ) -&amp;gt; nil | boolean loaded&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99; text-align:left&amp;quot; |`name` maybe:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | #12&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 12 buildpic&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %34:1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %-102:0&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = featureDef 102 s3o tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | !56&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units2&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shadow&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = shadowmap&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = specular cube map&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = reflection cube map&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shading&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = ground shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $grass&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = grass shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $heightmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | ${opt}:/LuaUI/images/image.png &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = load a texture from the VFS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int xsize, int ysize,&lt;br /&gt;
  [ { &lt;br /&gt;
    [target     = number,] &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(like GL_TEXTURE_1D,GL_TEXTURE_2D,...)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [fboDepth   = boolean] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  } ]&lt;br /&gt;
  ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTexture&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTextureFBO&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TextureInfo&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; nil | {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
   the format of the texture string is the same as in gl.Texture()&lt;br /&gt;
&amp;lt;/font&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number x | &lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum,&lt;br /&gt;
    number x |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexGen&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexGen&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil       &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CopyToTexture&#039;&#039;&#039;&lt;br /&gt;
  (string texture, int xoff, int yoff, int x, int y, int w, int h &lt;br /&gt;
  [,number target,number level])-&amp;gt;nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderToTexture&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string fbotexture, lua_func ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GenerateMipmap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs glGenerateMipmapEXT!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&#039;&#039;&#039;gl.SaveImage&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h,&lt;br /&gt;
    string filename [, table {alpha=boolean, yflip=boolean} ] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ReadPixels&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h [, number format = GL_RGBA ] )&lt;br /&gt;
    -&amp;gt; nil | number r,[g,[b,[a]]] | table { { {1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&#039;&#039;&#039;gl.Lighting&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ShadeModel&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#ShadeModel|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Light&#039;&#039;&#039;&lt;br /&gt;
  ( int light, &lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param1, number param2, number param3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Material&#039;&#039;&#039;&lt;br /&gt;
  ({&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&#039;&#039;&#039;gl.HasExtension&#039;&#039;&#039;&lt;br /&gt;
  ( string extname ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetNumber&#039;&#039;&#039;&lt;br /&gt;
  ( number ext, int count ) -&amp;gt; number [, number, number, ... #count ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetString&#039;&#039;&#039;&lt;br /&gt;
  ( number ext ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundCircle&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: number divs is the number of sides the circle will have. the higher the smoother the circle (and more GPU intensive) &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundQuad&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: x1,z1,x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z are correspond to the coordinates displayed by the tooltip &amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number z1, number x2, number z2,&lt;br /&gt;
    [ boolean useNorm, &amp;lt;span class=warning&amp;gt;(does nothing!)&amp;lt;/span&amp;gt;&lt;br /&gt;
      [ number tu1, number tv1, number tu2, number tv2 |&lt;br /&gt;
        boolean useTextureCoord ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&#039;&#039;&#039;gl.CreateQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil | userdata query&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.RunQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query, function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.GetQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil | number renderedFragments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexNames&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; { [1] = string texture, etc ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexCoords&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;gets the texcoord of a 3do texture in the 3do texture atlas&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string 3doTextureName ) -&amp;gt; number xstart, number ystart, number xend, number yend&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnsafeState&#039;&#039;&#039;&lt;br /&gt;
  ( number state [, boolean disable_state ], function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShadowMapParams&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; number xmid, number ymid, number p17, number p18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMatrixData&#039;&#039;&#039;&lt;br /&gt;
  ( GL.PROJECTION [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( GL.MODELVIEW  [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i] &lt;br /&gt;
  ( GL.TEXTURE    [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( &amp;quot;shadow&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camera&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;caminv&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camprj&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;billboard&amp;quot; )             -&amp;gt; nil | number, etc.. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Flush&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Finish&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Main&amp;diff=10872</id>
		<title>Lua:Main</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Main&amp;diff=10872"/>
		<updated>2011-02-19T14:47:20Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: /* Other useful information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Lua FAQ=&lt;br /&gt;
[[Lua_Beginners_FAQ]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=23&amp;amp;t=15596 Forum topic with some basic information about gadgets]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=23&amp;amp;t=16223 Forum topic with a manual on Spring lua scripting]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://answers.springlobby.info/ Q&amp;amp;A Site for Spring Developement]&lt;br /&gt;
&lt;br /&gt;
=Interfaces &amp;lt;font color=#55ee99 style=&amp;quot;float:right; font-size:50%&amp;quot;&amp;gt;(last update: 0.82rc)&amp;lt;/font&amp;gt;=&lt;br /&gt;
[[:Category:Lua]] (shows which interfaces are loaded by LuaUI,LuaRules,etc.)&amp;lt;br&amp;gt;&lt;br /&gt;
{{LuaInterfaces}}&lt;br /&gt;
&lt;br /&gt;
=Other useful information=&lt;br /&gt;
[[LuaCallinReturn]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://spring.clan-sy.com/wiki/COB_Constants#Custom_Variables COB Custom Variables] &amp;lt;br&amp;gt;&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=19560 Font Drawing System] &amp;lt;br&amp;gt;&lt;br /&gt;
[[UI_commands]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://spring.clan-sy.com/wiki/Lua_sync_to_unsync Synced &amp;lt;-&amp;gt; unsynced communication] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Animation-LuaScripting]]&lt;br /&gt;
&lt;br /&gt;
=Official Lua documentation=&lt;br /&gt;
[http://www.lua.org/pil/ &#039;Programming in Lua&#039; book online]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.lua.org/manual/5.1/ Lua 5.1 Reference manual]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://lua-users.org/wiki/TutorialDirectory Lua tutorials]&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11705</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=11705"/>
		<updated>2011-01-13T10:17:35Z</updated>

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

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

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

		<summary type="html">&lt;p&gt;Kingraptor: /spectator is no longer a /cheat command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;[[Using_Spring|&amp;lt;--Back to Using Spring]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Chat, Cheats, and Text Commands==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pressing ENTER will bring up a &amp;quot;say:&amp;quot; prompt which you can use to communicate with other players or issue &amp;quot;Text Commands&amp;quot;.  &amp;lt;br&amp;gt;&lt;br /&gt;
-To send a message to all who are connected, type your message and press ENTER.&amp;lt;br&amp;gt;  &lt;br /&gt;
-To send a message only to your allies, preface your message with &amp;quot;a:&amp;quot;.&amp;lt;br&amp;gt;  &lt;br /&gt;
-To send a message to any spectators, type &amp;quot;s:&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
-To send a message to a certain player, type &amp;quot;/w &amp;lt;playername&amp;gt;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Press ENTER to send it. There are also keybindings for all/ally/spec chat messaging:&lt;br /&gt;
&lt;br /&gt;
 Enter -&amp;gt; send to &amp;lt;send type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ctrl+Enter -&amp;gt; send to All (and sets &amp;lt;send type&amp;gt; to all)&lt;br /&gt;
&lt;br /&gt;
 Alt+Enter -&amp;gt; send to Allies (and sets &amp;lt;send type&amp;gt; to allies)&lt;br /&gt;
&lt;br /&gt;
 Shift+Enter -&amp;gt; send to Spectators (and sets &amp;lt;send type&amp;gt; to spectators)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;  To enter a Text Command, simply type the command and press ENTER.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Basic Text Commands===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/info #&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;Shows you what colour each player is, its CPU usage percentage and their ping delay in the bottom right corner of the screen. This is on by default. Arguments:&amp;lt;ol&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Sorts by allies&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Sorts by TeamID&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Sorts by name&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Sorts by CPU Usage&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Sorts by Ping&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;/ol&amp;gt;&lt;br /&gt;
	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/clock&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shows you the elapsed game time in minutes and seconds in the upper right corner of the screen. This is on by default.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/fps&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shows FPS counter in the upper right corner of the screen.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/gameinfo&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shows game information. Game version, actual game speed, commander ends, gravity, tidal, min wind, max wind, map size, map name and mod name.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/kick &amp;lt;name&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Kicks a player, only works for hosts.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/kickbynum #&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Kicks a player, only works for hosts.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/take&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Places all allied units that are owned by players who have lost connection to the server under your control. It is generally considered polite to consult with any still-connected allies before doing this. In a Commander Dies, Game Ends game, a player only loses once they have lost &#039;&#039;all&#039;&#039; their Commanders, and this mechanism will give them a second one.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/setmaxspeed #&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Changes the maximum speed multiplier (default is 3.0)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/setminspeed #&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Changes the minimum speed multiplier (default is 0.3)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/spectator&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Resigns from the game and goes to spectator mode.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/nospectatorchat [0|1]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Toggles spectator chat on/off, optional true/false parameters can be put in the end, for example: &amp;quot;.nospectatorchat 1&amp;quot;, otherwise it will toggle it on/off. Only works for hosts.&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cheat Codes=== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;th&amp;gt;Cheat Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;&#039;&#039;&#039;/cheat&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;enable cheats - Cheats don&#039;t work in multiplayer until the host types this&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/nocost&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Insta-build; everything is built immediatly. (doesn&#039;t work on things already under construction, only on new ones)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/team #&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Change player&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/give [amount] &amp;lt;unitName&amp;gt; [team] @x,y,z&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Place 1 or specified number of specified unit.  Valid units are the internal names of units as specified in the unit definition. Use the &amp;quot;all&amp;quot; switch to get ALL the units in the current mod. Putting a number after the unit name will give those units to the specified team. some examples: &lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;/give ARMCOM - gives you one ARMCOM&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;/give 10 CORKROG 3 - gives team 3 10 CORKROGs&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;/give all - gives one of every unit available&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/atm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;gain 1000 extra energy and metal.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/godmode [0|1]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;If set to 1, everybody (including specs) can control and view all units.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Graphic Settings===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/advshading [0|1]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Disables/enables advanced shading (reflective units, more?).&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/grounddecals [0|1]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Disables/enables ground decals (immune to tab complete?).&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/maxparticles #&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sets maximum amount of particles. Accepted values are between 1000 and 20000.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/shadows [0|1] #&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sets shadows to on or off, supports a second argument for shadow quality (1024, 2048, 4096 or 8192). Note that shadows are a massive performance hit&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/vsync [0|1]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Disables/enables vsync.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/water #&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;Sets water quality:&amp;lt;ol start=0&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Basic water, no performance hit.&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Reflective, Pretty, not a too large performance hit.&amp;lt;/li&amp;gt; &lt;br /&gt;
	&amp;lt;li&amp;gt;Dynamic, Very pretty, MASSIVE performance hit and buggy on some hardware.&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Reflective + Refractive, Prettier than reflective and pretty much the same performance hit, slightly buggy on some hardware.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;Bump-mapped water, very low impact like basic water, very pretty and realistic at average ranges.  Has shore waves and some basic effects for impacts/movement through the water.&lt;br /&gt;
	&amp;lt;/ol&amp;gt;&lt;br /&gt;
	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/cmdcolors &amp;lt;filename&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Loads specified cmdcolors.txt.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/ctrlpanel &amp;lt;filename&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Loads specified ctrlpanel.txt&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/luaui&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Access LuaUI commands provided by widgets. Use /luaui reload if LuaUI crashes. You can also use disable/enable arguments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/echo &amp;lt;text&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Prints a message to the console.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/say &amp;lt;text&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Specifies that you want to say something to the other players, useful for telling them how to do something with a / command without running it yourself. For example /say /luaui reload.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/specfullview #&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;Sets spectator viewing and selection options:&amp;lt;ol start=0&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;No special abilities.&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;view-all.&amp;lt;/li&amp;gt; &lt;br /&gt;
	&amp;lt;li&amp;gt;select-all.&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;view-all and select-all.&amp;lt;/li&amp;gt;&lt;br /&gt;
	&amp;lt;/ol&amp;gt;&lt;br /&gt;
	&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/volume #&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sets volume, accepted values are between 0 and 1.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Keybindings===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/bind &amp;lt;keyset&amp;gt; &amp;lt;action&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Binds a key or key combination.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/unbind &amp;lt;keyset&amp;gt; &amp;lt;action&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Unbinds a key or key combination.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/unbindaction &amp;lt;action&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Unbinds all keybinds that uses &amp;lt;action&amp;gt;.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/unbindkeyset &amp;lt;keyset&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Unbinds all bindings that uses &amp;lt;keyset&amp;gt;.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/unbindall&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Unbinds all keys except the chat keybinding.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/keysym &amp;lt;name&amp;gt; &amp;lt;keycode&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Adds a custom key symbol, The defaults can not be overridden. Name must start with a letter, and only contain letters, numbers, and &#039;_&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/keyset &amp;lt;name&amp;gt; &amp;lt;keyset&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Specifies a named keyset. Name must start with a letter, and only contain letters, numbers, and &#039;_&#039;. Named keysets may be accessed by prepending the &#039;&amp;amp;&#039; character to the name.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;/fakemeta &amp;lt;keysym&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Assigns an auxiliary key for the meta modifier (&amp;quot;space&amp;quot; is a good choice. Use fakemeta none to disable this feature&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Using_Spring|&amp;lt;--Back to Using Spring]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:Using Spring]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Expand_and_Exterminate&amp;diff=6583</id>
		<title>Expand and Exterminate</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Expand_and_Exterminate&amp;diff=6583"/>
		<updated>2009-10-08T03:34:30Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Note EE discontinued&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:E&amp;amp;E-wikiheadline.png|right|Expand &amp;amp; Exterminate]] &lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[[Image:E&amp;amp;E-screenshot2.jpg|thumb|200px|right|URC units outside a GD stronghold.]]&lt;br /&gt;
&lt;br /&gt;
=Overview=&lt;br /&gt;
&lt;br /&gt;
[[Image:E&amp;amp;E-screenshot.jpg|thumb|200px|right|A well defended GD stronghold.]]&lt;br /&gt;
&lt;br /&gt;
Expand and Exterminate offers three very unique and dynamic factions fighting for global domination. Each faction has its own design and fighting style that requires players to employ their own style of combat to defeat opponents. All three teams also have their own unique super weapons that offer great strategic difference. Expand and Exterminate is set in the near future that includes many futuristic and even alien-like vehicles for combat.&lt;br /&gt;
&lt;br /&gt;
Expand and Exterminate is currently &#039;&#039;discontinued&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download it here:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
[http://xn--d-bga.su/EEv46.sd7 - &#039;&#039;&#039;V .46&#039;&#039;&#039; (current)]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://hosted.filefront.com/Fang4606 - &#039;&#039;&#039;V .43&#039;&#039;&#039; (oudated)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Single Player:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Use KAIK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Faction Overview=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Global Dynasty==&lt;br /&gt;
[[IMAGE:E&amp;amp;E-GD.png|left]]&lt;br /&gt;
A tank force that uses brute force to push through enemies. GD uses conventional weapons like miniguns, cannon shells, and rockets along with more specialized laser and nuclear weapons. In a one on one fight, GD has the stronger units but they also have higher costs and build times. Their airforce consists of jets and helicopters.&lt;br /&gt;
[[GD Unit Guide]]&lt;br /&gt;
&lt;br /&gt;
==United Robot Confederation==&lt;br /&gt;
[[Image:E&amp;amp;E-URC.png|left]]&lt;br /&gt;
Enforces control through walking mechanized units that use stealth and versatility to attack. URC&#039;s main weapons are plasma and rockets with both flamethrowers and cannons showing up on more specialized units. URC units are the best at climbing hills and can navigate high terrain better than any other faction. Their airforce consists of Vtols. [[URC Unit Guide]]&lt;br /&gt;
&lt;br /&gt;
==New Initiative==&lt;br /&gt;
[[Image:E&amp;amp;E-NI.png|left]]&lt;br /&gt;
Utilizies heavy amounts of hovercraft and aircraft to swiftly move and attack enemies, great for raiding. They also expand quicker than the other two factions but those expansions are quite fragile. The NI use exotic weapons such as lightning, lasers and photon systems along with conventional rockets. Includes largest and strongest airforce of all three factions. (This faction is not currently available but is under active development)&lt;br /&gt;
&lt;br /&gt;
==Aliens==&lt;br /&gt;
Unknown force that fields bipedal and hovering ground combat units. This side is able to clone and morph many of its units to build up larger forces or advance to a new tech. They have the most powerful and most expensive units on the battlefield. They have a smaller air force than the other sides thats based on flying drones.&lt;br /&gt;
&lt;br /&gt;
=Strategy=&lt;br /&gt;
&lt;br /&gt;
==GD==&lt;br /&gt;
&lt;br /&gt;
In this guide you will learn how to utilize the GD&#039;s greatest attribute: staying power, and minimize their weakness: lack of mobility.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STAYING POWER&#039;&#039;&#039; - GD units generally have more armor, better range, and greater firepower than the combat units of the other factions.  This allows GD tanks to form a line and focus fire on incoming enemies.  GD also has better artillery than the other factions. The higher you climb the tech lvls the more armor hp damage and turrets you get on your units. At lvl 3 GD&#039;s tanks are lumbering behemoths with multiple turrets spewing fire in many directions. The key word in that last sentence is lumbering for those tanks are slow so either transport them or hide them till they are in range.&lt;br /&gt;
** &#039;&#039;&#039;LVL1&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;LVL2&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;LVL3&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CENTRALIZED RESOURCING&#039;&#039;&#039; - GD basic mexes give energy, so you won&#039;t need to build a reactor immediately. GD also has a light gas plant that gives the same amount of energy as the mexes. When you&#039;re getting around to building a nuclear reactor it gives 2x+ more energy than its closest equivalent (URC fusion). While this means less building you had better space out your reactors cause they go up like nukes. At lvl3 the Gd get the ability to make a Super reactor that produces around 2000 energy. GD also may construct armed mexes, allowing them to more easily hold territory and making raiding difficult but are more expensive.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LACK OF MOBILITY&#039;&#039;&#039; - Overall GD is the slowest of the three factions.  GD&#039;s first transport unit is available in the lvl1 air plant and is a key unit in their plans. Armed mexes combined with the rapid deployment of units via air transports helps minimize GD&#039;s lack of mobility.  GD light tanks can climb fairly well, lvl2 tanks have more difficulty, lvl3 tanks have horrid climbing ability. At lvl3 the GD receive a heavily armored transport helo. With a little skill (and some pre raid destruction) these will be able to penetrate enemy airspace and drop of their precious cargo. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;METAL RAIN&#039;&#039;&#039; - GD arty will devastate almost any target save air units. They have an advantage vs any side but they are expensive and slow moving so you must protect them wisely. Lvl 1 arty is good support for your tanks and can help soften up a defensive line before a push. Lvl 2 arty is more effective than its lvl 1 cousin, where as the lvl 1 arty fired straight up in high trajectory, the lvl 2 can fire both in low and high trajectories. The main difference is in accuracy, with low trajectory having higher accuracy. At lvl 3 the GD gain both saturation artillery and nuke artillery. The saturation arty is like its lvl 1 cousin in that it fires straight up but that is the end of similarities. With four barrels this unit puts out a constant stream of shells that is devastating to both static defense and mobile units. The nuke artillery is a devastating weapon if used correctly. You must pay for each individual shell you fire so this is gonna be expensive unit to use in bulk or consistently. However the power unleashed form this units is devastating. The GD also have a tactical nuke launcher. Similar to the nuke artillery, you must pay for each missile you fire. The main difference between them is accuracy. The tactical nuke is perfect for pinpoint strikes while the nuke arty can and does miss so be forewarned. &lt;br /&gt;
&lt;br /&gt;
GD is all about brute force; avoid your enemies&#039; emplacements if you can, but you can likely roll right over them. Lasers are particularly good at taking down defensive turrets (as well as units).&amp;lt;i&amp;gt;-Decimator&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most definitely. Don&#039;t forget to mix your units as well. &amp;lt;i&amp;gt;-Shadowsage&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==URC==&lt;br /&gt;
&lt;br /&gt;
this short guide you will explain URC&#039;s best attributes, agility and stealth.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mobility&#039;&#039;&#039; - To begin, when using the URC faction its best to take advantage of their ability to climb steep slopes and mountains. There are a number of ways to utilize this advantage as you have the ability to attack from angles no other faction can. Its advised that when possible that you should attack from the steepest ground possible as GD and NI units will usually not be able to follow you and your units will gain greater firing range. But most important to URC strategy is the potential for invading bases by avoiding defenses. While GD shoves through defenses and NI runs through it, the URC can completely ignore it by going through high terrain to surprise attack an opponent&#039;s base. If the high terrain is steep enough, you&#039;re assured that neither GD or NI can build defenses on their hills or mountains around their base.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STEALTH&#039;&#039;&#039; - The URC are the only faction to have units that cloak. After you have put up your early economy and first land factory use spiders (cheap, cloakable spy units that can build cameras and mines) very early in game to put cameras around key positions and to observe enemy bases. A good objective to keep in mind is to use this unit as your eyes and ears to basically monitor your enemies base for an undefended route that you can use late game to invade. Be sure to build a few battle mechs and a couple construction mechs afterwards to properly expand in early game. During middle to late game, you can build a stealth factory to produce a variety of medium strength attack mechs that can both cloak and jam radars. At the cost of this ability however these mechs are more expensive and take less damage than their non-stealth counterparts. Therefore its advised to use these units in small raiding parties to disrupt and destroy the opponents economy. Do not mainly focus them on aiding your main armies in combat as its not cost effective, they are best used for surprising un-protected bases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As URC you have many options open to you in conquest. Even though I have written guidelines for a suggested play style, you can still win without using stealth and agility, its entirely up to your gameplay style. You may find that using URC as brute force works better for you, as they can operate a highly strong head on function in proper numbers. Whatever your style is, URC can probably fit into it. &amp;lt;i&amp;gt;-Flintlock&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your increased mobility on the ground combined with stealth can give you as a URC player the option of choosing when and where you battle, a decisive point. As Flintlock said, you can essentially run successfully with any of an array of play styles. &amp;lt;i&amp;gt;-Neddiedrow&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Aliens==&lt;br /&gt;
&lt;br /&gt;
Aliens are the newest race to enter the E&amp;amp;E battlezones and also one of the most unique. This quick guide should give you a heads up as to how they operate.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CLONE AND MORPH&#039;&#039;&#039; - Rather than using traditional factories like GD or URC, the aliens increase their forces (and tech level) by cloning or morphing their units. The commander can construct the scout, construction and light combat forms. These units are built the same way as a building. To get more of these units, the commander can build more or a live unit can clone itself. Cloning will stop whatever the unit was currently doing and freeze it in place. As the process moves along the clone&#039;s outline will flash next to the cloning unit. Once cloning is finished the unit can go back to what it was doing (though builders will not automatically go back to building something they started) and the clone is ready to go. Aircraft however cannot morph or clone and must be built by the appropriate level Anti Air form. Ships can clone but not morph, in order to access higher level ships you&#039;ll need a higher level constructor.&lt;br /&gt;
&lt;br /&gt;
* Morphing works similarly to cloning except the unit that is morphed from is lost (in a sense you are &amp;quot;upgrading&amp;quot; that unit to the new type). The morph tree is [http://img252.imageshack.us/img252/6838/morphsystemkz1.jpg here]. You will know you are morphing as the build pic will be overlaid with the word Morph.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;EARLY GAME&#039;&#039;&#039; - The aliens have the most powerful units in the game, one vs. one they will beat their counterparts in the other factions. However this comes at the cost of a high price tag both in resources and building/cloning/morphing time. It is imperative that an alien player spread out and take as many metal deposits on the map as possible. This is best done using the scout form. Scout forms are cheap, fast, have long Line of Sight, and can very quickly get Extraction Pylons up over a large radius. Going construction form first will stall your economy to the point where you might never recover.&lt;br /&gt;
&lt;br /&gt;
* Generally two Extractors and four Energies will be enough to cover early unit costs.&lt;br /&gt;
* After the inital set of Scouts (2-4)and Light Combat Forms(0-2), have you commander go on to building 6-7 or so Energy Pylons. &lt;br /&gt;
* Use cloning and morphing to increase your army size and diversity but always have some &amp;quot;live&amp;quot; units to deal with enemies. &lt;br /&gt;
* Storage is very important for the aliens as an excess of resources allows cloning and morphing whenever its needed. 3-4 storage will carry you through most of a match but spares are always nice to have.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:E&amp;amp;E-screenshot3wide.jpg|702px|center|]]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*&#039;&#039;&#039;[http://xn--d-bga.su/EEv46.sd7 Download current version]&#039;&#039;&#039; (.46)&lt;br /&gt;
*&#039;&#039;&#039;[http://hosted.filefront.com/Fang4606/ Download outdated versions]&#039;&#039;&#039;  WARNING: these versions can be testing versions so bugs and imbalances could be present!!!&lt;br /&gt;
*&#039;&#039;&#039;[http://spring.clan-sy.com/phpbb/viewtopic.php?f=14&amp;amp;t=13801 Current Expand &amp;amp; Exterminate Thread on Spring Forums]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[http://smoth.net/foram/viewforum.php?f=7 Expand &amp;amp; Exterminate section on Smoth&#039;s Forums]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Credits=&lt;br /&gt;
&#039;&#039;&#039;Mod Creation&#039;&#039;&#039;&lt;br /&gt;
*Fang - Created all of E&amp;amp;E, scripted, textured, modeled and compiled&lt;br /&gt;
*Smoth - Scripting and modeling advice, and much other assistance &lt;br /&gt;
*Argh - Scripting and modeling advice, as well as much other assistance&lt;br /&gt;
*Ground Zero - Provided modeling help and sounds &lt;br /&gt;
*Nemo - Weapon setup assistance&lt;br /&gt;
*Forboding Angel - Cursors/Loading Screens/Sounds&lt;br /&gt;
*Wasp - Buildpics/Icons/Website help&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Additional Help&#039;&#039;&#039;&lt;br /&gt;
*Decimator - Wrote GD Strategy&lt;br /&gt;
*Flintlock - Initial Promotional/Biography/Wiki/Graphic Designs&lt;br /&gt;
*Zoombie - Unit Guides&lt;br /&gt;
*j5mello - Wiki&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alpha Testing&#039;&#039;&#039;&lt;br /&gt;
*Big Steve&lt;br /&gt;
*Cabbage&lt;br /&gt;
*DasBruce&lt;br /&gt;
*DavetheBrave&lt;br /&gt;
*Decimator&lt;br /&gt;
*Drexion&lt;br /&gt;
*GuiltySpark&lt;br /&gt;
*OverDamage&lt;br /&gt;
*Flintlock&lt;br /&gt;
*Forboding Angel&lt;br /&gt;
*J5mello&lt;br /&gt;
*Smoth&lt;br /&gt;
*Tenebrous&lt;br /&gt;
*Wasp&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beta Testing&#039;&#039;&#039;&lt;br /&gt;
*Sleksa&lt;br /&gt;
*WarhammerC&lt;br /&gt;
*Cronyx&lt;br /&gt;
*Chapparal&lt;br /&gt;
*Sekhmet/Neddiedrow&lt;br /&gt;
*Aun&lt;br /&gt;
*Kixxe&lt;br /&gt;
*Krogothe&lt;br /&gt;
*Drone_Fragger&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Current Players&#039;&#039;&#039;&lt;br /&gt;
*Thank you for playing and keep giving input on the current version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Back to [[Games]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Games]]&lt;br /&gt;
{{Category:Mods}}&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=The_Lighter_Side_Of_Spring&amp;diff=18260</id>
		<title>The Lighter Side Of Spring</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=The_Lighter_Side_Of_Spring&amp;diff=18260"/>
		<updated>2008-11-16T08:01:27Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Even developers, content creators and rabid players occassionally have abberant moments of comedic genius. Therefore, there is a section of the Spring Wiki dedicated to the lighter side of what we as a community do and who we as a community are.&lt;br /&gt;
&lt;br /&gt;
===Comics &amp;amp; Images===&lt;br /&gt;
*[[1v0ry_k1ng&#039;s Works]]&lt;br /&gt;
*[http://spring.clan-sy.com/phpbb/viewtopic.php?t=8428&amp;amp;highlight=smug Smug Guide to Running Your Boy]&lt;br /&gt;
*[[Ra1ders Works]]&lt;br /&gt;
*[[http://spring.clan-sy.com/phpbb/viewtopic.php?f=10&amp;amp;t=15187&amp;amp;start=36 The Battlefield in CORE SUXXX from the-middleman]]&lt;br /&gt;
*[[http://spring.clan-sy.com/phpbb/viewtopic.php?f=10&amp;amp;t=15405 The Battlefield in Roleplay from the-middleman]]&lt;br /&gt;
&lt;br /&gt;
===Quotations &amp;amp; Sound Clips===&lt;br /&gt;
&lt;br /&gt;
*[http://springlobby.info/quotes SpringBash] - Real quotes from lobby, often taken out of context!&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:player&amp;diff=7162</id>
		<title>FAQ:player</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:player&amp;diff=7162"/>
		<updated>2008-11-16T07:48:02Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Playing=&lt;br /&gt;
&lt;br /&gt;
==What is with this weird right-click mode? I&#039;m &#039;bout to break my keyboard.==&lt;br /&gt;
&lt;br /&gt;
Sorry, you&#039;ll just have to get used to it. As of now it can&#039;t be changed.&lt;br /&gt;
&lt;br /&gt;
==Why is somebody else also controlling my units?==&lt;br /&gt;
&lt;br /&gt;
In the &#039;game lobby&#039; there are two sets of teams. There are the &#039;Ids&#039; and the &#039;teams&#039;. If you are on the same &#039;Id&#039;, then you both get the same commander, and can control the same units (commonly referred to as comsharing). If you are on the same &#039;Team&#039;, then you both get different commanders and can&#039;t control each others units.&lt;br /&gt;
&lt;br /&gt;
==Then why would I want to be on the same &#039;Id&#039; as somebody?==&lt;br /&gt;
&lt;br /&gt;
Because it&#039;s fun to just drive around units and not have to worry about commanding. (Assuming that one of the people on the team is commanding.)&lt;br /&gt;
Most importantly, however, you can split tasks, such as base building, and troops management.&lt;br /&gt;
&lt;br /&gt;
==Is there a way that I can play music directly through Spring, with alternating tracks for building/attacking like in the original Total Annihilation?==&lt;br /&gt;
&lt;br /&gt;
Yes, there is. It is an add on (GroupAI) you have to download separately:&lt;br /&gt;
http://jobjol.nl/1188&lt;br /&gt;
&lt;br /&gt;
There is also an ingame sound-volume-slider you might find useful (lua-script):&lt;br /&gt;
http://jobjol.nl/1218&lt;br /&gt;
&lt;br /&gt;
==Sometimes I can&#039;t write anything but numbers and some other symbols. Why is that?==&lt;br /&gt;
&lt;br /&gt;
This is most likely because of the Windows language bar change from which &amp;lt;br&amp;gt;Spring doesn&#039;t recognize the characters written. &lt;br /&gt;
 Note: That Default hotkeys in Windows XP for changing the language is &amp;lt;br&amp;gt;Shift+Alt, which is similar to square build hotkeys in Spring!&lt;br /&gt;
&lt;br /&gt;
==How do I talk to my allies only?==&lt;br /&gt;
&lt;br /&gt;
You must type &#039;a:&#039; before you speak, or press &amp;quot;Alt Enter&amp;quot; at the same time. Here&#039;s an example: a: Now I am talking to my allies only.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Help! After I&#039;m finished driving a unit, the camera is all insane! This is nuts! How do I fix it?==&lt;br /&gt;
&lt;br /&gt;
Whoa now. Calm down. Just press ctrl + mouse button 3 to change camera modes.  If your unit is destroyed in FPS mode, you will stay in FPS mode until you change camera modes.  Also, the camera will stay in &amp;quot;free look&amp;quot; when FPS mode is disengaged, press middle-mouse or J to switch to normal scrolling.&lt;br /&gt;
&lt;br /&gt;
==After I&#039;m finished driving a unit, where what used to be my mouse pointer is now a crosshair. Why?==&lt;br /&gt;
&lt;br /&gt;
-This is a special &#039;view mode&#039; that allows you to move around the screen much faster. It&#039;s good for viewing the battle or getting screenshots. Simply press on your third mouse button or &#039;delete&#039; to revert back to your mouse pointer.&lt;br /&gt;
&lt;br /&gt;
==But I don&#039;t have a third mouse button!==&lt;br /&gt;
&lt;br /&gt;
The key &#039;J&#039; works in the same way as the &#039;middle mouse button&#039; does. So where you would use ctrl + middle mouse button to change camera modes, ctrl + j does the same thing. Pressing J once will also switch you from &#039;crosshair mode&#039; to &#039;pointer mode&#039; and vice versa.&lt;br /&gt;
&lt;br /&gt;
==IÃ‚Â´ve managed to get stuck in this weird camera mode and my perspective is all messed up. How do I switch to the overhead (OTA style) camera?==&lt;br /&gt;
&lt;br /&gt;
Shift+Backspace (or Shift+J or Shift+MiddleMouseClick) switches between the fps style, total war style and OTA style cameras. Use it to get your camera back to normal in this situation.&lt;br /&gt;
&lt;br /&gt;
==People are cheating! How do I stop it?!==&lt;br /&gt;
Well currently, you can&#039;t.&lt;br /&gt;
&lt;br /&gt;
Only the host can &amp;quot;activate&amp;quot; the cheat codes. After that, any player can do almost all cheats.&lt;br /&gt;
&lt;br /&gt;
The best thing to do is just not play with the cheaters anymore. But with new spring version cheats are disabled in multiplayer, so that paragraph is hopefully now irrelevant.&lt;br /&gt;
&lt;br /&gt;
==Well how do you cheat?==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Cheat Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&#039;&#039;&#039;.cheat&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;enable cheats - Cheats don&#039;t work in multiplayer until the host types this&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.nocost&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;instabuild (doesn&#039;t work on things already under construction, only on new ones)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.setmaxspeed 50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Changes the maximum speed multiplier (default is 3.0)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.setminspeed 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Changes the minimum speed multiplier (default is 0.3)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.spectator&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Allows you to see the entire map... but you lose control of your units&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.team 0, .team 1, etc.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Change player&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.give ARMCOM, .give 10 CORKROG, etc.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Place 1 or specified number of specified unit.  Valid units are the internal names of units as specified in the unit definition.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
You can use auto-completion in the spring console if you don&#039;t remember the internal unit name. To do that type: &lt;br /&gt;
 &amp;quot;.give arm&amp;quot; and then press your &#039;&#039;&#039;TAB key&#039;&#039;&#039; &lt;br /&gt;
A list of all matching units will be shown.&lt;br /&gt;
&lt;br /&gt;
==In Game Commands==&lt;br /&gt;
&lt;br /&gt;
The following &#039;&#039;non-cheating&#039;&#039; commands are also available in game:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;/info&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shows you what colour each player is and their ping delay in the bottom right corner of the screen.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;/clock&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shows you the elapsed game time in minutes and seconds in the upper right corner of the screen&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.take&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pulls all allied units, that are owned by players who have lost connection to the server, to your team.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How do I ally or unally in game?==&lt;br /&gt;
&lt;br /&gt;
Type /ally &amp;lt;teamID&amp;gt; [0|1] (this only works if the host allows changing allies midgame).&lt;br /&gt;
&lt;br /&gt;
==How do I give somebody units or metal or energy?==&lt;br /&gt;
&lt;br /&gt;
Press the &#039;H&#039; key. Then select the amount of metal and/or energy to share. Then select the receiving player and press OK.&lt;br /&gt;
&lt;br /&gt;
When sharing units, you must first select the units to share, then press &#039;H&#039; key. Tick share units checkbox and choose a receiving player.&lt;br /&gt;
&lt;br /&gt;
==How do I continually give somebody metal and/or energy after a certain point (i.e. Original TA commands +setshare..., +shareall)?==&lt;br /&gt;
&lt;br /&gt;
You&#039;ll notice that on your metal and energy bars (top of screen), there are two red bars. You have to put them wherever you want your metal and energy to be shared after.&lt;br /&gt;
&lt;br /&gt;
==This game is different than TA, the units HP and damage are not the same==&lt;br /&gt;
&lt;br /&gt;
First off, Spring is not TA. Spring is an engine, on which various games can be run, some of which are modifications of TA content.&lt;br /&gt;
&lt;br /&gt;
Now, there were several third party &amp;quot;balance&amp;quot; mods for the original TA game. One of those mods were XTA, and was developed by the same clan (SY) that has brought life back to TA, making Spring.&lt;br /&gt;
&lt;br /&gt;
There are many other such mods, of which [[Balanced Annihilation]] is the most popular.&lt;br /&gt;
&lt;br /&gt;
Now are several mods available, install the mod of your choice.&lt;br /&gt;
&lt;br /&gt;
* http://spring.jobjol.nl/files.php?subcategory_id=5&lt;br /&gt;
* http://spring-portal.com/index.php/docman/cat_view/36-mods&lt;br /&gt;
* http://www.tasdownloads.com/?ta=2&lt;br /&gt;
&lt;br /&gt;
==XTA? OTA? AA? OMFGLAMO? WTF do those abbreviations mean?==&lt;br /&gt;
&lt;br /&gt;
zwzsg maintains a handy dandy FAQ about TA, and the abbreviations that relate to Spring too, of course.&lt;br /&gt;
[http://www.tauniverse.com/forum/showthread.php?t=27309 click here]. See also the Spring [[Glossary]], which contains brief explanations for all non-standard words and phrases.&lt;br /&gt;
&lt;br /&gt;
==Why am I destroyed so easily by long range assaults?==&lt;br /&gt;
&lt;br /&gt;
This is a realistic feature of Spring. Units will automatically attack &#039;radar blips&#039; (units that they can not actually see, but that are indicated on radar). However, the accuracy is very bad while shooting at radar blips until:&lt;br /&gt;
&lt;br /&gt;
* Your unit kills a lot of units and gets experience&lt;br /&gt;
* You get a targeting facility.&lt;br /&gt;
&lt;br /&gt;
==Can I kick people from my &#039;game lobby&#039; or my game?==&lt;br /&gt;
&lt;br /&gt;
First of all, you have to be the host to kick. Use the good old &amp;quot;/kick playernamehere&amp;quot; command. Works in-game too, use it wisely.&lt;br /&gt;
&lt;br /&gt;
==I hate driving around with the &#039;arrow keys&#039;. Is there any way I can use the &#039;W-A-S-D&#039; controls (the controls most First Person Shooters use) anymore?==&lt;br /&gt;
&lt;br /&gt;
Go into your Spring directory and edit the uikeys file. Keep in mind that &#039;S&#039; is originally a &#039;hot-key&#039; that will stop your units and that &#039;D&#039; is a &#039;hot-key&#039; for your commander&#039;s D-Gun. You might want to change those too.&lt;br /&gt;
&lt;br /&gt;
==I turned the shadows feature on; I still don&#039;t see shadows. What gives?==&lt;br /&gt;
&lt;br /&gt;
Your graphics card can&#039;t handle shadows, so Spring automatically turns them off.&lt;br /&gt;
&lt;br /&gt;
==I can&#039;t go backwards when I am &#039;driving&#039; a unit. Why not?==&lt;br /&gt;
&lt;br /&gt;
Because TA units were never intended to go backwards. Sorry, but you just cant.&lt;br /&gt;
&lt;br /&gt;
==I&#039;m in an Unreal Tournament kind of mood. How do I strafe?==&lt;br /&gt;
&lt;br /&gt;
You can only strafe in &#039;brawler type&#039; ships, such as the brawler, rapier, and light gunships.&lt;br /&gt;
&lt;br /&gt;
==How can I record and watch demos/replays?==&lt;br /&gt;
&lt;br /&gt;
From version 0.62 onwards recordings of all the games you play are easily available for replay via the Replays button in the TASClient.&lt;br /&gt;
&lt;br /&gt;
You can use the Speed up/Slow down game keys while watching the replay, along with other in-game commands like .team&lt;br /&gt;
&lt;br /&gt;
From version 0.60b1 onwards, demos are automatically recorded in the &amp;quot;demos&amp;quot; folder, underneath your Spring folder (default is C:\Program Files\Spring\demos), named for the date and map they were played on. If you play multiple games in the same day on the same map, the games will also be numbered to prevent them from overwriting each other.&lt;br /&gt;
&lt;br /&gt;
From version 0.62 onwards, to view a demo from the Windows file manager you can just double click the file name.&lt;br /&gt;
&lt;br /&gt;
==Sometimes when I play get &amp;quot;not sync&amp;quot; &amp;quot;delayed sync&amp;quot; errors==&lt;br /&gt;
&lt;br /&gt;
That&#039;s caused because of lag. One of the players in the game is having some lag issues. Ask him/her to free up its bandwidth for the game to use.&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can use the pause key and wait till the connection gets more stable.&lt;br /&gt;
&lt;br /&gt;
Ping is the second number showed when you use the /info command ingame, values larger than ~1000ms are not usual in a normal game and are a signal of lag.&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:content&amp;diff=7109</id>
		<title>FAQ:content</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:content&amp;diff=7109"/>
		<updated>2008-11-16T07:47:13Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Content=&lt;br /&gt;
 &lt;br /&gt;
==Do Spring maps need a &amp;quot;ground&amp;quot;?==&lt;br /&gt;
&lt;br /&gt;
Spring maps do require a ground. We have had many requests to have space maps, however, a &amp;quot;true&amp;quot; (ala Homeworld) space setting is not likely. It would have to wait until a much later stage. This does not mean that TA&#039;s style of &amp;quot;space&amp;quot; maps won&#039;t be possible, (see the Final Frontier TC for examples of this).&lt;br /&gt;
&lt;br /&gt;
==You stated that Spring uses the TA unit format.==&lt;br /&gt;
&lt;br /&gt;
Spring does use the Total Annihilation unit format. However, there is also a new format dubbed &#039;.s3o&#039; which uses a UV mapped texture instead of 3do&#039;s per face texturing system, as well as other improvements.&lt;br /&gt;
&lt;br /&gt;
==How powerful will Spring&#039;s custom format be?==&lt;br /&gt;
&lt;br /&gt;
Total Annihilation&#039;s unit format was extremely limited. Most of these limitations will either be expanded or non-existent in Spring&#039;s custom unit format. One of the most exciting improvements is the introduction of an entirely new method of scripting, with nearly complete control over every aspect of a unit&#039;s actions and behaviors.&lt;br /&gt;
&lt;br /&gt;
==Does Spring have a limited number of weapons?==&lt;br /&gt;
No. Unlike Total Annihilation, Spring&#039;s weapon IDs will be unlimited. Meaning it will be possible to add as many third-party units as you want.  However, the current model format limits 16 weapons to each unit.&lt;br /&gt;
&lt;br /&gt;
==Does Spring have a limited number of unique units?==&lt;br /&gt;
&lt;br /&gt;
No. Unit IDs, like weapon IDs, will be unlimited.&lt;br /&gt;
&lt;br /&gt;
==Will units have a maximum of 3 unique weapons?==&lt;br /&gt;
&lt;br /&gt;
Total Annihilation had a limitation that permitted a maximum of 3 unique weapons per unit. Spring currently has a way to have 16 weapons per unit. (Replace Primary, Secondary, Tertiary by 1 2 3 ...16). More can be made possible by modifying the source if there&#039;s a sufficient demand by mod makers.&lt;br /&gt;
&lt;br /&gt;
==I&#039;m curious as to the per-unit polygon limit.==&lt;br /&gt;
&lt;br /&gt;
The engine itself does not have a polygon count limit. The limit is that of the processing power of today&#039;s computers. Since Spring requires a 3D card, the maximum polygon count per unit will be many, many times higher than Total Annihilation&#039;s; tricounts of &amp;gt;1000 on Peewee equivalents are perfectly viable. This isn&#039;t an excuse to waste polies, though!&lt;br /&gt;
&lt;br /&gt;
==Will units be able to perform basic terraforming?==&lt;br /&gt;
&lt;br /&gt;
Units do not have terraforming ability by default. Support for terraforming is possible with [[Lua Scripting]], such as in the [[Complete Annihilation]] mod. Alternatively, construction units can restore ground, and certain weapons (especially explosive ones) can be used to deform the ground.&lt;br /&gt;
&lt;br /&gt;
==Will tunnel building be possible?==&lt;br /&gt;
&lt;br /&gt;
Subterranean areas of any sort is impossible. However, it is possible to heavily deform the ground with explosives... Which is great fun!&lt;br /&gt;
&lt;br /&gt;
==Will the ground&#039;s water retention be editable?==&lt;br /&gt;
&lt;br /&gt;
No. Water will always collect when a piece of land has a height below sea level.&lt;br /&gt;
&lt;br /&gt;
==Does Spring have a limit on the number of races?==&lt;br /&gt;
&lt;br /&gt;
Spring has no limit on the total number of sides/races.&lt;br /&gt;
&lt;br /&gt;
==What are the sizes of the biggest and smallest units?==&lt;br /&gt;
&lt;br /&gt;
Static units (buildings, defenses, etc.) have no size limitations in the engine. Technically, neither do mobile units, but units with a footprint larger than 4x4 &amp;quot;squares&amp;quot; (an arbitrary size standard created by Cavedog) might have problems pathfinding.&lt;br /&gt;
&lt;br /&gt;
==What is going to be the maximum possible sea depth?==&lt;br /&gt;
&lt;br /&gt;
For all practical purposes, it will be unlimited. The depth values are stored as &amp;quot;float variables&amp;quot;, so it is doubtful that maps would ever be made which even come close to approaching the limit.&lt;br /&gt;
&lt;br /&gt;
==Will Spring support campaigns?==&lt;br /&gt;
&lt;br /&gt;
Basic Map scripting has been implemented, using a Lua scripting engine. From that, it would be possible to make a basic campaign, but for ease of use a better way of selecting scripts and an improved Single player menu is needed.&lt;br /&gt;
&lt;br /&gt;
See [[Mission development]] for more details.&lt;br /&gt;
&lt;br /&gt;
==How big are the Spring files?==&lt;br /&gt;
&lt;br /&gt;
Spring will be as small as however much content is included with it. The &amp;quot;essential&amp;quot; files are only be several megabytes large. Content (such as maps and units) will add considerable size to the Spring download. Currently, the file size is roughly 30 MB.&lt;br /&gt;
&lt;br /&gt;
==How will Spring render sound effects?==&lt;br /&gt;
&lt;br /&gt;
Sound is rendered 3D, meaning that the volume and direction (assuming a multi-speaker setup) vary with the location of the camera from the sound &amp;quot;emitter&amp;quot;. What this translates into gameplay terms means that the closer you are to a unit making a sound or motion, the louder the sound will be. Additionally, the sound will be heard differently depending on which way the camera is facing relative to units making sound.&lt;br /&gt;
&lt;br /&gt;
==Will Spring have ambient sound?==&lt;br /&gt;
&lt;br /&gt;
There is no ambient sound, and we haven&#039;t planned on adding it thus far.&lt;br /&gt;
&lt;br /&gt;
==Will there be an AI or a &amp;quot;skirmish&amp;quot; mode?==&lt;br /&gt;
&lt;br /&gt;
We have created an interface for artificial intelligences (AIs), and several are currently under development. Information on these can be found at the [[AIs]] wiki page.&lt;br /&gt;
&lt;br /&gt;
==Will a &amp;quot;possess&amp;quot; or a FPS option be present?==&lt;br /&gt;
&lt;br /&gt;
Yes, it is possible to fully control a unit from the first person view. It is more of a gimmick, but it still allows for a nice diversion once in a while.  Instructions on its use are in the [[Using_Spring#FPS_.22Mode.22_.28C.29|Using Spring]] article.&lt;br /&gt;
&lt;br /&gt;
==How do I create maps?==&lt;br /&gt;
&lt;br /&gt;
See the [[Map development]] page for all the map info.&lt;br /&gt;
&lt;br /&gt;
==How do I create units/mods?==&lt;br /&gt;
&lt;br /&gt;
See the [[Mod_and_Unit_development#Mod_devlopement|Mod and Unit development]] page on creating units/ mods.&lt;br /&gt;
&lt;br /&gt;
[[Category:Content]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:player&amp;diff=7161</id>
		<title>FAQ:player</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:player&amp;diff=7161"/>
		<updated>2008-11-16T07:44:40Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Playing=&lt;br /&gt;
&lt;br /&gt;
==What is with this weird right-click mode? I&#039;m &#039;bout to break my keyboard.==&lt;br /&gt;
&lt;br /&gt;
Sorry, you&#039;ll just have to get used to it. As of now it can&#039;t be changed.&lt;br /&gt;
&lt;br /&gt;
==Why is somebody else also controlling my units?==&lt;br /&gt;
&lt;br /&gt;
In the &#039;game lobby&#039; there are two sets of teams. There are the &#039;Ids&#039; and the &#039;teams&#039;. If you are on the same &#039;Id&#039;, then you both get the same commander, and can control the same units (commonly referred to as comsharing). If you are on the same &#039;Team&#039;, then you both get different commanders and can&#039;t control each others units.&lt;br /&gt;
&lt;br /&gt;
==Then why would I want to be on the same &#039;Id&#039; as somebody?==&lt;br /&gt;
&lt;br /&gt;
Because it&#039;s fun to just drive around units and not have to worry about commanding. (Assuming that one of the people on the team is commanding.)&lt;br /&gt;
Most importantly, however, you can split tasks, such as base building, and troops management.&lt;br /&gt;
&lt;br /&gt;
==Is there a way that I can play music directly through Spring, with alternating tracks for building/attacking like in the original Total Annihilation?==&lt;br /&gt;
&lt;br /&gt;
Yes, there is. It is an add on (GroupAI) you have to download separately:&lt;br /&gt;
http://jobjol.nl/1188&lt;br /&gt;
&lt;br /&gt;
There is also an ingame sound-volume-slider you might find useful (lua-script):&lt;br /&gt;
http://jobjol.nl/1218&lt;br /&gt;
&lt;br /&gt;
==Sometimes I can&#039;t write anything but numbers and some other symbols. Why is that?==&lt;br /&gt;
&lt;br /&gt;
This is most likely because of the Windows language bar change from which &amp;lt;br&amp;gt;Spring doesn&#039;t recognize the characters written. &lt;br /&gt;
 Note: That Default hotkeys in Windows XP for changing the language is &amp;lt;br&amp;gt;Shift+Alt, which is similar to square build hotkeys in Spring!&lt;br /&gt;
&lt;br /&gt;
==How do I talk to my allies only?==&lt;br /&gt;
&lt;br /&gt;
You must type &#039;a:&#039; before you speak, or press &amp;quot;Alt Enter&amp;quot; at the same time. Here&#039;s an example: a: Now I am talking to my allies only.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Help! After I&#039;m finished driving a unit, the camera is all insane! This is nuts! How do I fix it?==&lt;br /&gt;
&lt;br /&gt;
Whoa now. Calm down. Just press ctrl + mouse button 3 to change camera modes.  If your unit is destroyed in FPS mode, you will stay in FPS mode until you change camera modes.  Also, the camera will stay in &amp;quot;free look&amp;quot; when FPS mode is disengaged, press middle-mouse or J to switch to normal scrolling.&lt;br /&gt;
&lt;br /&gt;
==After I&#039;m finished driving a unit, where what used to be my mouse pointer is now a crosshair. Why?==&lt;br /&gt;
&lt;br /&gt;
-This is a special &#039;view mode&#039; that allows you to move around the screen much faster. It&#039;s good for viewing the battle or getting screenshots. Simply press on your third mouse button or &#039;delete&#039; to revert back to your mouse pointer.&lt;br /&gt;
&lt;br /&gt;
==But I don&#039;t have a third mouse button!==&lt;br /&gt;
&lt;br /&gt;
The key &#039;J&#039; works in the same way as the &#039;middle mouse button&#039; does. So where you would use ctrl + middle mouse button to change camera modes, ctrl + j does the same thing. Pressing J once will also switch you from &#039;crosshair mode&#039; to &#039;pointer mode&#039; and vice versa.&lt;br /&gt;
&lt;br /&gt;
==IÃ‚Â´ve managed to get stuck in this weird camera mode and my perspective is all messed up. How do I switch to the overhead (OTA style) camera?==&lt;br /&gt;
&lt;br /&gt;
Shift+Backspace (or Shift+J or Shift+MiddleMouseClick) switches between the fps style, total war style and OTA style cameras. Use it to get your camera back to normal in this situation.&lt;br /&gt;
&lt;br /&gt;
==People are cheating! How do I stop it?!==&lt;br /&gt;
Well currently, you can&#039;t.&lt;br /&gt;
&lt;br /&gt;
Only the host can &amp;quot;activate&amp;quot; the cheat codes. After that, any player can do almost all cheats.&lt;br /&gt;
&lt;br /&gt;
The best thing to do is just not play with the cheaters anymore. But with new spring version cheats are disabled in multiplayer, so that paragraph is hopefully now irrelevant.&lt;br /&gt;
&lt;br /&gt;
==Well how do you cheat?==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Cheat Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&#039;&#039;&#039;.cheat&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;enable cheats - Cheats don&#039;t work in multiplayer until the host types this&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.nocost&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;instabuild (doesn&#039;t work on things already under construction, only on new ones)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.setmaxspeed 50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Changes the maximum speed multiplier (default is 3.0)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.setminspeed 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Changes the minimum speed multiplier (default is 0.3)&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.spectator&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Allows you to see the entire map... but you lose control of your units&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.team 0, .team 1, etc.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Change player&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.give ARMCOM, .give 10 CORKROG, etc.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Place 1 or specified number of specified unit.  Valid units are the internal names of units as specified in the unit definition.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
You can use auto-completion in the spring console if you don&#039;t remember the internal unit name. To do that type: &lt;br /&gt;
 &amp;quot;.give arm&amp;quot; and then press your &#039;&#039;&#039;TAB key&#039;&#039;&#039; &lt;br /&gt;
A list of all matching units will be shown.&lt;br /&gt;
&lt;br /&gt;
==In Game Commands==&lt;br /&gt;
&lt;br /&gt;
The following &#039;&#039;non-cheating&#039;&#039; commands are also available in game:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;3&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Command&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Effect&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;/info&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shows you what colour each player is and their ping delay in the bottom right corner of the screen.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;/clock&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Shows you the elapsed game time in minutes and seconds in the upper right corner of the screen&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;.take&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pulls all allied units, that are owned by players who have lost connection to the server, to your team.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How do I ally or unally in game?==&lt;br /&gt;
&lt;br /&gt;
I&#039;m pretty sure you can&#039;t. Yet.&lt;br /&gt;
&lt;br /&gt;
==How do I give somebody units or metal or energy?==&lt;br /&gt;
&lt;br /&gt;
Press the &#039;H&#039; key. Then select the amount of metal and/or energy to share. Then select the receiving player and press OK.&lt;br /&gt;
&lt;br /&gt;
When sharing units, you must first select the units to share, then press &#039;H&#039; key. Tick share units checkbox and choose a receiving player.&lt;br /&gt;
&lt;br /&gt;
==How do I continually give somebody metal and/or energy after a certain point (i.e. Original TA commands +setshare..., +shareall)?==&lt;br /&gt;
&lt;br /&gt;
You&#039;ll notice that on your metal and energy bars (top of screen), there are two red bars. You have to put them wherever you want your metal and energy to be shared after.&lt;br /&gt;
&lt;br /&gt;
==This game is different than TA, the units HP and damage are not the same==&lt;br /&gt;
&lt;br /&gt;
First off, Spring is not TA. Spring is an engine, on which various games can be run, some of which are modifications of TA content.&lt;br /&gt;
&lt;br /&gt;
Now, there were several third party &amp;quot;balance&amp;quot; mods for the original TA game. One of those mods were XTA, and was developed by the same clan (SY) that has brought life back to TA, making Spring.&lt;br /&gt;
&lt;br /&gt;
There are many other such mods, of which [[Balanced Annihilation]] is the most popular.&lt;br /&gt;
&lt;br /&gt;
Now are several mods available, install the mod of your choice.&lt;br /&gt;
&lt;br /&gt;
* http://spring.jobjol.nl/files.php?subcategory_id=5&lt;br /&gt;
* http://spring-portal.com/index.php/docman/cat_view/36-mods&lt;br /&gt;
* http://www.tasdownloads.com/?ta=2&lt;br /&gt;
&lt;br /&gt;
==XTA? OTA? AA? OMFGLAMO? WTF do those abbreviations mean?==&lt;br /&gt;
&lt;br /&gt;
zwzsg maintains a handy dandy FAQ about TA, and the abbreviations that relate to Spring too, of course.&lt;br /&gt;
[http://www.tauniverse.com/forum/showthread.php?t=27309 click here]. See also the Spring [[Glossary]], which contains brief explanations for all non-standard words and phrases.&lt;br /&gt;
&lt;br /&gt;
==Why am I destroyed so easily by long range assaults?==&lt;br /&gt;
&lt;br /&gt;
This is a realistic feature of Spring. Units will automatically attack &#039;radar blips&#039; (units that they can not actually see, but that are indicated on radar). However, the accuracy is very bad while shooting at radar blips until:&lt;br /&gt;
&lt;br /&gt;
* Your unit kills a lot of units and gets experience&lt;br /&gt;
* You get a targeting facility.&lt;br /&gt;
&lt;br /&gt;
==Can I kick people from my &#039;game lobby&#039; or my game?==&lt;br /&gt;
&lt;br /&gt;
First of all, you have to be the host to kick. Use the good old &amp;quot;/kick playernamehere&amp;quot; command. Works in-game too, use it wisely.&lt;br /&gt;
&lt;br /&gt;
==I hate driving around with the &#039;arrow keys&#039;. Is there any way I can use the &#039;W-A-S-D&#039; controls (the controls most First Person Shooters use) anymore?==&lt;br /&gt;
&lt;br /&gt;
Go into your Spring directory and edit the uikeys file. Keep in mind that &#039;S&#039; is originally a &#039;hot-key&#039; that will stop your units and that &#039;D&#039; is a &#039;hot-key&#039; for your commander&#039;s D-Gun. You might want to change those too.&lt;br /&gt;
&lt;br /&gt;
==I turned the shadows feature on; I still don&#039;t see shadows. What gives?==&lt;br /&gt;
&lt;br /&gt;
Your graphics card can&#039;t handle shadows, so Spring automatically turns them off.&lt;br /&gt;
&lt;br /&gt;
==I can&#039;t go backwards when I am &#039;driving&#039; a unit. Why not?==&lt;br /&gt;
&lt;br /&gt;
Because TA units were never intended to go backwards. Sorry, but you just cant.&lt;br /&gt;
&lt;br /&gt;
==I&#039;m in an Unreal Tournament kind of mood. How do I strafe?==&lt;br /&gt;
&lt;br /&gt;
You can only strafe in &#039;brawler type&#039; ships, such as the brawler, rapier, and light gunships.&lt;br /&gt;
&lt;br /&gt;
==How can I record and watch demos/replays?==&lt;br /&gt;
&lt;br /&gt;
From version 0.62 onwards recordings of all the games you play are easily available for replay via the Replays button in the TASClient.&lt;br /&gt;
&lt;br /&gt;
You can use the Speed up/Slow down game keys while watching the replay, along with other in-game commands like .team&lt;br /&gt;
&lt;br /&gt;
From version 0.60b1 onwards, demos are automatically recorded in the &amp;quot;demos&amp;quot; folder, underneath your Spring folder (default is C:\Program Files\Spring\demos), named for the date and map they were played on. If you play multiple games in the same day on the same map, the games will also be numbered to prevent them from overwriting each other.&lt;br /&gt;
&lt;br /&gt;
From version 0.62 onwards, to view a demo from the Windows file manager you can just double click the file name.&lt;br /&gt;
&lt;br /&gt;
==Sometimes when I play get &amp;quot;not sync&amp;quot; &amp;quot;delayed sync&amp;quot; errors==&lt;br /&gt;
&lt;br /&gt;
That&#039;s caused because of lag. One of the players in the game is having some lag issues. Ask him/her to free up its bandwidth for the game to use.&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can use the pause key and wait till the connection gets more stable.&lt;br /&gt;
&lt;br /&gt;
Ping is the second number showed when you use the /info command ingame, values larger than ~1000ms are not usual in a normal game and are a signal of lag.&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Complete_Annihilation&amp;diff=5108</id>
		<title>Complete Annihilation</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Complete_Annihilation&amp;diff=5108"/>
		<updated>2008-09-09T07:41:37Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: fix list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
[http://trac.caspring.org/wiki/ Complete Annihilation] is generally the second most played mod in Spring. It has an active playerbase and while it is still under development, it is kept fully playable. It traces its heritage to Total Annihilation, however, &#039;&#039;CA is not OTA&#039;&#039;. It is gradually moving away from OTA, replacing the copyrighted models and textures with open-source ones while shifting change the gameplay dramatically. CA aims to be a dynamic, action-packed, hassle-free game, full of clever strategies and constantly moving combat.&lt;br /&gt;
&lt;br /&gt;
[http://trac.caspring.org/wiki/CaIntro Click here for a more detailed introduction]&lt;br /&gt;
&lt;br /&gt;
== Design goals ==&lt;br /&gt;
*A large range of viable tactics.&lt;br /&gt;
*Larger emphasis on unit decisions/selections and their micromanagement.&lt;br /&gt;
*Less emphasis on economy micromanagement (mex overdrive replaces moho metal extractors and metal makers).&lt;br /&gt;
*All units situationally useful throughout the game (there is no unit redundancy, heavy and light units work together on the battlefield).&lt;br /&gt;
*Superior graphics and appearance.&lt;br /&gt;
*Powerfull LUA GUI enhancements to free your hands and allow players to focus on tactical decisions (air transports automatically ferry units from factories, units can be set to autoretreat when damaged etc.).&lt;br /&gt;
*Faster and more demanding gameplay (units move faster and unit selection is more important).&lt;br /&gt;
*Unit differences achieved using game dynamics and not using special hidden damages/armor classes.&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
&lt;br /&gt;
==Gameplay==&lt;br /&gt;
*No effective single unit spam (hopefully).&lt;br /&gt;
*Kbots and Vehicles are both viable on most maps.&lt;br /&gt;
*Arm and Core have a different play style.&lt;br /&gt;
*Windmill output increases with altitude.&lt;br /&gt;
&lt;br /&gt;
==Graphics==&lt;br /&gt;
*New models and textures.&lt;br /&gt;
*New explosions, weapon and unit effects.&lt;br /&gt;
*Play in cartoon mode with the outline widget.&lt;br /&gt;
*Higher resolution 3do textures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Mutators=&lt;br /&gt;
&lt;br /&gt;
==Deployment Mutator==&lt;br /&gt;
Place your units and give orders to them before the game starts: you don&#039;t have to wait to use the big guns.&lt;br /&gt;
&lt;br /&gt;
==Tactics Mutator==&lt;br /&gt;
Place your units on the battlefield before the game starts then wipe out your enemy. With no economic management, you are free to exercise your tactics.&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Homepage:&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;[http://www.caspring.org www.caspring.org]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download it here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[http://trac.caspring.org/wiki/sd SpringDownloader (the easiest &amp;amp; fastest to get CA and Spring maps)]&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[http://web.alexmic.free.fr/CAUpdater.html CAUpdater, written in PyQt4 (windows, linux) ]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Back to [[Mods]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mods]]&lt;br /&gt;
{{Category:Mods}}&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mods&amp;diff=14622</id>
		<title>Mods</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mods&amp;diff=14622"/>
		<updated>2008-09-07T16:26:35Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 10px; border: 1px #aaa solid; border-collapse: collapse; background: #1155aa&amp;quot;&lt;br /&gt;
|&amp;lt;center&amp;gt;&#039;&#039;&#039;Other Languages&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&#039;&#039;&#039;[[Image:germany_flag.gif]] [[Mods (de)|Deutsch]]&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If you&#039;re interested in editing mods or creating your own mods, see the [[Mod Development]] page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===What are Mods? / Spring Client-Compatible Mods===&lt;br /&gt;
&lt;br /&gt;
Mods traditionally constitute additions to a game that change the way it works. However, the term Mod when used in connection to the Spring project refers to a game in its own right that runs on the Spring engine.  The following mods adhere to the official [[Mod_specification]] which ensures that they work with the Lobby Client. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Category:Mods}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Where to download Mods===&lt;br /&gt;
* [http://spring.clan-sy.com/wiki/Getting_Spring_Content_and_Links &amp;quot;Getting Spring Content and Links&amp;quot;] wiki page&lt;br /&gt;
&lt;br /&gt;
* http://spring.jobjol.nl/files.php?subcategory_id=5&lt;br /&gt;
&lt;br /&gt;
* http://spring-portal.com/index.php/docman/cat_view/36-mods&lt;br /&gt;
&lt;br /&gt;
* http://www.tasdownloads.com/?ta=2&lt;br /&gt;
&lt;br /&gt;
===Gimmick Mods===&lt;br /&gt;
&lt;br /&gt;
* [[Chess Mod]]&lt;br /&gt;
* [[Spawn]]&lt;br /&gt;
* [[Timberwolf Mod]]&lt;br /&gt;
* [[The Blue Tanks]]&lt;br /&gt;
* [[Duel]]&lt;br /&gt;
&lt;br /&gt;
===Mod Mutators===&lt;br /&gt;
&lt;br /&gt;
* [[Epic EE|Epic Scale Expand &amp;amp; Exterminate]]&lt;br /&gt;
* [[Nemo&#039;s Final Frontier]] &lt;br /&gt;
* [[WarC/Balanced Absolute Annihilation]]&lt;br /&gt;
* [[Forged Absolute Annihilation]]&lt;br /&gt;
* [[Hover Absolute Annihilation]]&lt;br /&gt;
* [[Persh/Excessive Absolute Annihilation]]&lt;br /&gt;
&lt;br /&gt;
===Mods in Production===&lt;br /&gt;
&lt;br /&gt;
=====Unreleased=====&lt;br /&gt;
* [[GEM|Galactic Empire Mod]]&lt;br /&gt;
* [[RealOTA]]&lt;br /&gt;
* [[Dune]]&lt;br /&gt;
* [[Lego Spring]]&lt;br /&gt;
* [[Spring1944|Spring 1944 (Formally AATA on the OTA engine)]]&lt;br /&gt;
* [[GINTA]]&lt;br /&gt;
* [[CvC]]&lt;br /&gt;
* [[TrueOTA]]&lt;br /&gt;
* [[Dozerz]]&lt;br /&gt;
* [[Tactical Front]]&lt;br /&gt;
* [[Tactical Smash]]&lt;br /&gt;
* [[EPIC ANNIHILATION RELOADED (WITH KROGOTS LOL)]]&lt;br /&gt;
&lt;br /&gt;
=====Released Incomplete=====&lt;br /&gt;
* [[Battletech]]&lt;br /&gt;
* [[TA_BattleFleet]] by VonGratz&lt;br /&gt;
* [[BloX]]&lt;br /&gt;
* [[The Plot of War]]&lt;br /&gt;
* [[Epic Legions]]&lt;br /&gt;
&lt;br /&gt;
===Incomplete Mods===&lt;br /&gt;
&lt;br /&gt;
These consist of &amp;quot;crude&amp;quot; mods that do not work with the current builds of the Spring engine and incomplete projects that are not in production.  You can download many of the following other, partially functioning Mods from: [http://www.fileuniverse.com/?page=listing&amp;amp;ID=92 File Universe]:&lt;br /&gt;
&lt;br /&gt;
* DM45Spring.exe&lt;br /&gt;
* [[MAD TA]] Buildpics for Spring&lt;br /&gt;
* [[MiniSpring]] (Actually a code modification, abandoned.)&lt;br /&gt;
* [[OTAR-EVAMP]]&lt;br /&gt;
* [[Project Ragnarok]]&lt;br /&gt;
* [[Rhyoss]] for Spring&lt;br /&gt;
* [[UTASP]] 5 Spring&lt;br /&gt;
* [[WH - F]]&lt;br /&gt;
* [[Kustorion]] Thoughs Of Whole Design&lt;br /&gt;
&lt;br /&gt;
=== Other Resources ===&lt;br /&gt;
* [http://www.fileuniverse.com/?page=listing&amp;amp;ID=92 File Universe] link&lt;br /&gt;
* &amp;quot;[http://www.tauniverse.com/forum/showthread.php?s=&amp;amp;postid=435292#post435292 Mods, Races, TCs, Unit Packs]&amp;quot; entry in the [http://www.tauniverse.com tauniverse.com] forum&lt;br /&gt;
* [[Modweb_Generator]] is a tool that allows you to set up a web that shows information about mods, this page has some example mod-webs.&lt;br /&gt;
* [http://modinfo.adune.nl Modinfo] shows information about units/weapons/corpses etc stuff, in almost any mod (if some mod is missing, PM at TradeMark). Modinfo has also an &amp;quot;error reporting&amp;quot; tool, which shows errors in the TDF files, like missing ; marks. &amp;quot;find errors&amp;quot; utility shows several types of errors, and other useful information about cleaning up your mod.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mods]] [[Category:Content]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Category:Mods&amp;diff=23565</id>
		<title>Category:Mods</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Category:Mods&amp;diff=23565"/>
		<updated>2008-09-07T16:20:35Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: Fixed background color. Someone needs to go over the wiki and fix all the tables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&#039;&#039;&#039;Spring Mods&#039;&#039;&#039;&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 0; background: #1155aa; border: 1px #aaa solid; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; width=&amp;quot;245&amp;quot;|[[Absolute Annihilation]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot; width=&amp;quot;245&amp;quot;|[[Balanced Annihilation]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot; width=&amp;quot;245&amp;quot;|[[BOTA|Basically OTA]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Complete Annihilation]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Commander Shooter]] &lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[EvoTA]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Expand and Exterminate]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Final Frontier]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Gundam Annihilation|Gundam RTS]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Kernel Panic]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[KuroTA]] &lt;br /&gt;
|align=&amp;quot;center&amp;quot; width=&amp;quot;245&amp;quot;|[[Maximum Annihilation]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Nanoblobs]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[SWTA|Star Wars TA]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[SpiderPack]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[TA-WD|TA: World Domination]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[The Blue Tank]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[The Lost Legacy]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[UberHack]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[War Evolution]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[NOTA]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Xect vs. Mynn]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[XTA]]&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Content]]&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Complete_Annihilation&amp;diff=5105</id>
		<title>Complete Annihilation</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Complete_Annihilation&amp;diff=5105"/>
		<updated>2008-09-07T15:46:19Z</updated>

		<summary type="html">&lt;p&gt;Kingraptor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
Complete Annihilation (CA) is a game made for the Spring engine. It is a derivative of the original Total Annihilation (OTA), with the goal of eventually replacing all copyrighted content (models, textures and the like) with original, open source content.&lt;br /&gt;
&lt;br /&gt;
CA emphasizes distinct unit roles and fluid, always-moving gameplay from start to finish.&lt;br /&gt;
&lt;br /&gt;
[http://trac.caspring.org/wiki/CaIntro A more detailed introduction]&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
&lt;br /&gt;
==User interface and LuaUI==&lt;br /&gt;
*New cursors&lt;br /&gt;
*Centers and selects the Comm at startup&lt;br /&gt;
*Warns when d-gun is limited&lt;br /&gt;
*Shows which units are being transported&lt;br /&gt;
*Depicts unit experience with tank icons&lt;br /&gt;
*Automatically controls your metal makers for maximum efficiency&lt;br /&gt;
*Always see what your factories are building and give the orders quickly with buildbar.&lt;br /&gt;
*New button graphics.&lt;br /&gt;
*Units reply with speech.&lt;br /&gt;
&lt;br /&gt;
==Gameplay and LuaRules==&lt;br /&gt;
*No effective single unit spam (hopefully).&lt;br /&gt;
*Kbots and Vehicles are both viable on most maps.&lt;br /&gt;
*Arm and Core have a different play style.&lt;br /&gt;
*Set at which percentage of remaining health your units will retreat to the nearest Commander or nanotower.&lt;br /&gt;
*Pointless micromanagement is not rewarded.&lt;br /&gt;
*The Commander can cloak nearby units  for a hefty energy cost.&lt;br /&gt;
*Windmill output increases with altitude.&lt;br /&gt;
*Sharing with an enemy is disables unless cheat mode is active.&lt;br /&gt;
*Unit sharing is delayed to avoid share at last second before death scenarios.&lt;br /&gt;
*Lose the resources contained in a storage building when it is destroyed.&lt;br /&gt;
&lt;br /&gt;
==Graphics==&lt;br /&gt;
*New models and textures.&lt;br /&gt;
*New explosions, weapon and unit effects.&lt;br /&gt;
*Play in cartoon mode with the outline widget.&lt;br /&gt;
*Higher resolution 3do textures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Mutators=&lt;br /&gt;
&lt;br /&gt;
==Deployment Mutator==&lt;br /&gt;
Place your units and give orders to them before the game starts: you don&#039;t have to wait to use the big guns.&lt;br /&gt;
&lt;br /&gt;
==Tactics Mutator==&lt;br /&gt;
Place your units on the battlefield before the game starts then wipe out your enemy. With no economic management, you are free to exercise your tactics.&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Homepage:&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;[http://www.caspring.org www.caspring.org]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download it here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[http://trac.caspring.org/wiki/sd SpringDownloader (the easiest &amp;amp; fastest to get CA and Spring maps)]&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[http://web.alexmic.free.fr/CAUpdater.html CAUpdater, written in PyQt4 (windows, linux) ]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Back to [[Mods]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mods]]&lt;br /&gt;
{{Category:Mods}}&lt;/div&gt;</summary>
		<author><name>Kingraptor</name></author>
	</entry>
</feed>