<?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=Lurker</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=Lurker"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Lurker"/>
	<updated>2026-11-08T22:25:20Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11669</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=11669"/>
		<updated>2009-05-15T00:18:34Z</updated>

		<summary type="html">&lt;p&gt;Lurker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Resources =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddTeamResource&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;m&amp;quot; | &amp;quot;e&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;m&amp;quot; | &amp;quot;e&amp;quot;, number amount |&lt;br /&gt;
    { m = number amount, e = 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;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&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 ) -&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;
&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 makes the unit act like it was reclaimed&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;&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 noBlock [, boolean collide ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number depth [,number range] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitBuildSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number builderID,&lt;br /&gt;
    number buildSpeed, [ number repairSpeed [, number reclaimSpeed&lt;br /&gt;
  [,number resurrectSpeed [, number captureSpeed [, number terraformSpeed ]] ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitArmored&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean armored ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean enabled [, number power] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot;, number mode ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;moveFactor&amp;quot;, number factor) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;minDamage&amp;quot;, number minDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;mazDamage&amp;quot;, number maxDamage ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot;, number x, number y, number z) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum, table states ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&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;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;
    }&lt;br /&gt;
  &amp;lt;/font&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;
&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;
== 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&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 AllyTeamID ) -&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 ) -&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.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;
&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;
&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;
&#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;
&#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;
&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;
= 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;font color=#55ee99&amp;gt;(heightmap[x][z] += height;)&amp;lt;/font&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;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/font&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;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&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;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#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.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;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10943</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10943"/>
		<updated>2009-04-23T03:58:35Z</updated>

		<summary type="html">&lt;p&gt;Lurker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;font style=&amp;quot;font-size:300%&amp;quot;&amp;gt;Lua Call-Ins, with parameters&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&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;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;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;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&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;  unknown, please document.&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;
&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;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; unknown, but probably nil.&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;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10942</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10942"/>
		<updated>2009-04-23T03:56:38Z</updated>

		<summary type="html">&lt;p&gt;Lurker: Start of info about the rendering process.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;font style=&amp;quot;font-size:300%&amp;quot;&amp;gt;Lua Call-Ins, with parameters&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&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;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;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;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&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;  unknown, please document.&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;
&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 {&lt;br /&gt;
&lt;br /&gt;
	notDrawing     = 0,&lt;br /&gt;
&lt;br /&gt;
	normalDraw     = 1,&lt;br /&gt;
&lt;br /&gt;
	shadowDraw     = 2,&lt;br /&gt;
&lt;br /&gt;
	reflectionDraw = 3,&lt;br /&gt;
&lt;br /&gt;
	refractionDraw = 4&lt;br /&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;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; unknown, but probably nil.&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;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Balanced_Annihilation:Chat&amp;diff=2689</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=2689"/>
		<updated>2009-02-14T18:55:47Z</updated>

		<summary type="html">&lt;p&gt;Lurker: w: LIES&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;/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;
&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;/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;
&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>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Debugging_sync_errors&amp;diff=5316</id>
		<title>Debugging sync errors</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Debugging_sync_errors&amp;diff=5316"/>
		<updated>2009-01-15T17:31:09Z</updated>

		<summary type="html">&lt;p&gt;Lurker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Desync happens when simulation gives different results for different clients. Currently it is detected by means of checksumming crucial data on every write; this checksum is then transferred to the host, who compares them to his own checksum.&lt;br /&gt;
&lt;br /&gt;
For purposes of debugging, the sync debugger stores every such write with some debugging information. When a desync happens, the write history is compared on every client, who then sends locations where computation has given different results. The location is then resolved to line number of the engine source, which should provide information about the nature of the desync.&lt;br /&gt;
&lt;br /&gt;
To enable sync debugging, you have use a special build of Spring. To obtain it, you must:&lt;br /&gt;
&lt;br /&gt;
# Go to #buildserv and request a syncdebug build with &#039;&#039;!rebuild profile=syncdebug&#039;&#039;. You can request a specific version by adding &#039;&#039;tag=&amp;lt;svn tag&amp;gt;&#039;&#039; or &#039;&#039;rev=&amp;lt;svn rev number&amp;gt;&#039;&#039;. Type &#039;&#039;!help&#039;&#039; for help.&lt;br /&gt;
# If the build works, an executable will be uploaded to the usual place; at the time of this writing, it&#039;s http://planetspring.free.fr/spring/executable/. The generated archive will have [syncdebug] in its name.&lt;br /&gt;
# To compile it with linux use: &#039; scons configure syncdebug=yes synctrace=yes optimize=yes debug=1 gml=false&#039; after getting the same revision from git.&lt;br /&gt;
# Host a game. Make sure &#039;&#039;&#039;every&#039;&#039;&#039; player who joins has this exe; it&#039;s not needed to have it at the time of joining the battle, but when the game starts, everyone must have it. Expect random undefined behaviour otherwise.&lt;br /&gt;
# If you want engine source lines, the host has to download two more files: debug symbols and addr2line. Debug symbols are generated and uploaded by buildserv; as of now, they can be found at http://planetspring.free.fr/spring/debug/. addr2line is a part of MinGW32 [http://sourceforge.net/project/showfiles.php?group_id=2435&amp;amp;package_id=11290 binutils package].&lt;br /&gt;
## Download debug symbols&lt;br /&gt;
## Download addr2line&lt;br /&gt;
## Extract both to where your syncdebug-enabled spring.exe lives&lt;br /&gt;
## &#039;&#039;&#039;Rename debug symbols to spring.dbg&#039;&#039;&#039;&lt;br /&gt;
Only the host needs to download addr2line and debug symbols.&lt;br /&gt;
&lt;br /&gt;
When everybody is in game, test your setup by enabling cheats (&#039;&#039;/cheat&#039;&#039;) and having one of the players do a test desync (&#039;&#039;/desync&#039;&#039;). The game should pause and syncdebugger should do its work. If the game pauses, but you won&#039;t see SD messages, it&#039;s likely that one of the clients doesn&#039;t have the correct exe.&lt;br /&gt;
&lt;br /&gt;
In addition to syncdebugger logs, syncdebug engine builds also have synctrace enabled. This option makes spring.exe write a file called trace&amp;lt;playernum&amp;gt;.log which logs important simulation events in a diff-friendly format. After a desync, get this file from the desynced player(s) and do a &#039;&#039;diff -u yourtrace histrace&#039;&#039; to find the first &#039;&#039;logged&#039;&#039; sync mismatch. The real desync probably happened somewhere in between the two log lines.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re a mod developer, please be aware that Lua may be a source of desyncs. E.g. table iteration using pairs when you have tables, coroutines, or functions as keys is not a sync-safe operation, see [http://spring.clan-sy.com/mantis/view.php?id=1050 mantis #1050] for example of such a desync.&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5848</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5848"/>
		<updated>2009-01-13T13:36:19Z</updated>

		<summary type="html">&lt;p&gt;Lurker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Spring Downloads==&lt;br /&gt;
&lt;br /&gt;
On this page you will find information on how to download the latest releases from the Spring project for various platforms. &lt;br /&gt;
&lt;br /&gt;
Make sure that you download the latest drivers for your graphic card in order to make Spring work correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Spring RTS Engine + Mods/Games==&lt;br /&gt;
&lt;br /&gt;
If all you are interested in is playing the game using the existing public lobby server (for multiplayer online play), then these are the files you will want.&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://lrad.de/spring_0.78.1.1.exe Click here to download]&#039;&#039;&#039; 15.0MB, added 2009-01-12&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.springlobby.info/windows/spring_0.78.1.1.exe Mirror #1]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This installer can provides the core files you need to play Spring the TASClient multiplayer lobby client and the autodownloader. Use it to get maps and mods, or download them from some hosting sites (lsited in main).&lt;br /&gt;
&lt;br /&gt;
===Linux===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;[[SetupGuide|Linux set up guide]]&#039;&#039;&#039; provides set up information for various Linux distributions.&lt;br /&gt;
&lt;br /&gt;
The Linux releases track with the Windows release, and those playing the game on Linux can play against players running the Windows version.&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
&lt;br /&gt;
The Mac OS X port is rough and unfinished. Help with its development would be greatly appreciated. More information on the current state of this port can be found &#039;&#039;&#039;[[Spring_on_MacOSX|here]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Source Code ===&lt;br /&gt;
&#039;&#039;&#039;[http://spring.clan-sy.com/dl/spring_0.78.1.1_src.tar.lzma Linux .tar.lzma (smaller)]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://spring.clan-sy.com/dl/spring_0.78.1.1_src.tar.bz2 Linux .tar.bz2]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Lobby server==&lt;br /&gt;
&lt;br /&gt;
This is for those wanting to run their own private or public lobby server, e.g. if you want to use Spring on a LAN without the need for an external internet connection. See the readme &#039;&#039;&#039;[http://spring.clan-sy.com/dl/tasserver_readme.txt here]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://spring.clan-sy.com/dl/TASServer_035.exe Click here to download]&#039;&#039;&#039; 120.7kb, added 2008-03-02 &lt;br /&gt;
&lt;br /&gt;
===Linux===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://spring.clan-sy.com/dl/TASServer.jar Click here to download]&#039;&#039;&#039; 100.7kb, added 2008-03-02 &lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(Untested)&#039;&#039;&#039; Try the Linux release above, and let us know if it works!&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:WeaponMainDir&amp;diff=8831</id>
		<title>Gamedev:WeaponMainDir</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:WeaponMainDir&amp;diff=8831"/>
		<updated>2008-11-22T00:53:11Z</updated>

		<summary type="html">&lt;p&gt;Lurker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WeaponMainDir: The Simple Way==&lt;br /&gt;
WeaponMainDirX is a vector showing the direction of the weapon&#039;s aiming cone.&lt;br /&gt;
MaxAngleDifX is the size of the aiming cone.&lt;br /&gt;
&lt;br /&gt;
For instance, if you want your Primary Weapon to have a 90Ã‚Â° fire arc forward, you&#039;d write:&amp;lt;br&amp;gt;&lt;br /&gt;
  &#039;&#039;&#039;WeaponMainDir1=0 0 1;&#039;&#039;&#039;  //x:0 y:0 z:1 =&amp;gt; that&#039;s forward!&lt;br /&gt;
  &#039;&#039;&#039;MaxAngleDif1=90;&#039;&#039;&#039;       //90Ã‚Â° from side to side, or 45Ã‚Â° from center to each direction&lt;br /&gt;
&lt;br /&gt;
If you want to precisely choose the WeaponMainDir, you could run UpSpring, create a new piece, move it around until the line, from the origin, to your piece, is along the line you want your weapon to fire, then write down the coordinate in WeaponMainDir. Keep in mind UpSpring invert the sign of the axis x and z.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--old confusing explanation removed; if you want it see history--&lt;br /&gt;
&lt;br /&gt;
[[Category:Unit development]]&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12433</id>
		<title>Lua VFS</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12433"/>
		<updated>2008-05-30T22:54:52Z</updated>

		<summary type="html">&lt;p&gt;Lurker: /* Modes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modes ==&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.MOD&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.MAP&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.BASE&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_FIRST&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_FIRST&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_ONLY&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_ONLY&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that RAW_ONLY and ZIP_ONLY are merely backwards-compatible names for RAW and ZIP.&lt;br /&gt;
&lt;br /&gt;
Currently, MOD, MAP, and BASE are unimplemented, and all act like ZIP.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&#039;&#039;&#039;VFS.Include&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, table enviroment [, number mode ] ] ) -&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.LoadFile&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; nil | lstring data&lt;br /&gt;
&#039;&#039;&#039;VFS.FileExists&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;VFS.DirList&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot; [, string &amp;quot;pattern&amp;quot;  [, number mode [, string &amp;quot;optstr&amp;quot; ] ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string filename, ... }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;  optstr can contain:&lt;br /&gt;
      &amp;quot;r&amp;quot; = recursive&lt;br /&gt;
      &amp;quot;d&amp;quot; = include dirs&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Packing ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;darkgreen&amp;quot; style=&amp;quot;font-size:110%&amp;quot;&amp;gt;The Pack- and Unpack-functions are used to convert numbers-&amp;gt;strings and strings-&amp;gt;numbers.&lt;br /&gt;
So you can read a binary file and then convert the received strings back to numbers and the other way around. Also you can use it in combination with the SendLuaXYZMsg-functions.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;arguments are:&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( number arg1, number arg2, number arg3, ... )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( {[1]=number,[2]=number,..} )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;arguments are:&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackX( string &amp;quot;binary&amp;quot; [, number offset ] [, number count] )&#039;&#039;&#039;&lt;br /&gt;
  -&amp;gt; number | table { [1]=number,[2]=number,.. }&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12432</id>
		<title>Lua VFS</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12432"/>
		<updated>2008-05-30T22:54:06Z</updated>

		<summary type="html">&lt;p&gt;Lurker: /* Modes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Modes ==&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.MOD&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.MAP&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.BASE&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_FIRST&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_FIRST&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_ONLY&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_ONLY&#039;&#039;&#039;&lt;br /&gt;
Note that RAW_ONLY and ZIP_ONLY are merely backwards-compatible names for RAW and ZIP.&lt;br /&gt;
&lt;br /&gt;
Currently, MOD, MAP, and BASE are unimplemented, and all act like ZIP.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&#039;&#039;&#039;VFS.Include&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, table enviroment [, number mode ] ] ) -&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.LoadFile&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; nil | lstring data&lt;br /&gt;
&#039;&#039;&#039;VFS.FileExists&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;VFS.DirList&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot; [, string &amp;quot;pattern&amp;quot;  [, number mode [, string &amp;quot;optstr&amp;quot; ] ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string filename, ... }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;  optstr can contain:&lt;br /&gt;
      &amp;quot;r&amp;quot; = recursive&lt;br /&gt;
      &amp;quot;d&amp;quot; = include dirs&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Packing ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;darkgreen&amp;quot; style=&amp;quot;font-size:110%&amp;quot;&amp;gt;The Pack- and Unpack-functions are used to convert numbers-&amp;gt;strings and strings-&amp;gt;numbers.&lt;br /&gt;
So you can read a binary file and then convert the received strings back to numbers and the other way around. Also you can use it in combination with the SendLuaXYZMsg-functions.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;arguments are:&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( number arg1, number arg2, number arg3, ... )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( {[1]=number,[2]=number,..} )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;arguments are:&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackX( string &amp;quot;binary&amp;quot; [, number offset ] [, number count] )&#039;&#039;&#039;&lt;br /&gt;
  -&amp;gt; number | table { [1]=number,[2]=number,.. }&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Units:FlankingBonus&amp;diff=19073</id>
		<title>Units:FlankingBonus</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Units:FlankingBonus&amp;diff=19073"/>
		<updated>2007-11-24T06:01:18Z</updated>

		<summary type="html">&lt;p&gt;Lurker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=FlankingBonus=&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
FlankingBonus is a quick, integrated way to give units a resistance to damage from certain directions.  It started life long ago, in the dark ages of spring, under the name of BonusShield.  In its default form it hid there, secretly manipulating the damage dealt to units in an attempt to encourage flanking.  And there it worked its special little magic, known to very few, until July of 2007, when the great lurking presence felt it brush by, and exposed bonusShield to the world.&lt;br /&gt;
&lt;br /&gt;
This mysterious code had few parameters at the time, and each one of them was hardcoded.  There was the direction it was facing, that would determine where there would be minimum damage, which started at south.  But it was more complicated than that.  You see, bonusShield could move, and did so by building up a reserve of mobility as time ticked by.  When an attack would hit, it would use this reserve to swing and face the attacker, buying a precious bit of extra health as long as no units could sneak by to the other direction.  But bonusShield had its flaws.  It completely ignored the way a unit was facing, so a unit spinning in place while being shot from the West could recieve minimum damage from each shot.  It was also &#039;mandatory hardcoded crap&#039;, completely unchangeable by any unit settings.&lt;br /&gt;
&lt;br /&gt;
But lo, the lurking presence had a plan: a plan to not only rid the world of the scourge of hardcoded bonusShield, but dreams of something better, something usefull, something that could make a tank&#039;s armor realistic, give units the ability to have variable armor layout at the push of a button, not merely a &#039;bonusShield&#039;, but a flankingBonus, a fully configurable system built out of the ashes of the old.  And so it set to work, making an extensive patch to be applied to spring&#039;s core.&lt;br /&gt;
&lt;br /&gt;
This patch held the ability to banish bonusShield at a modder&#039;s whim, but held so much more for those willing to dig deeper.  Suddenly, direction, mobility, damage levels, and more were all configurable.  A tank could have extra armor in its front, or following the main turret, and click this power on and off in a second.  Rejoicing was farspread, and history books were filled with the inspiring tale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Specifics==&lt;br /&gt;
&lt;br /&gt;
flankingBonus takes the following tags:&amp;lt;br&amp;gt;&lt;br /&gt;
====int flankingBonusMode;====&lt;br /&gt;
0: no flanking bonus&amp;lt;br&amp;gt;&lt;br /&gt;
1: global coords, mobile&amp;lt;br&amp;gt;&lt;br /&gt;
2: unit coords, mobile&amp;lt;br&amp;gt;&lt;br /&gt;
3: unit coords, locked&amp;lt;br&amp;gt;&lt;br /&gt;
====float3 flankingBonusDir;====&lt;br /&gt;
units takes less damage when attacked from this dir (encourage flanking fire)&lt;br /&gt;
====float  flankingBonusMax;====&lt;br /&gt;
damage factor for the least protected direction&lt;br /&gt;
====float  flankingBonusMin;====&lt;br /&gt;
damage factor for the most protected direction&lt;br /&gt;
====float  flankingBonusMobilityAdd;====&lt;br /&gt;
how much the ability of the flanking bonus direction to move builds up each frame&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMode===&lt;br /&gt;
Defaults to what is set in modrules, which itself defaults to 1, the old way.&lt;br /&gt;
Mode 0 is self explanitory.&amp;lt;br&amp;gt;&lt;br /&gt;
Mode 1 builds up the ability to move over time, and swings to face attacks, but does not respect the way the unit is facing.&amp;lt;br&amp;gt;&lt;br /&gt;
Mode 2 also can swing, but moves with the unit as it turns.&amp;lt;br&amp;gt;&lt;br /&gt;
Mode 3 stays with the unit as it turns and otherwise doesn&#039;t move, the ideal mode to simulate something such as tank armor.&amp;lt;br&amp;gt;&lt;br /&gt;
To set the default in modrules.tdf, use the following code:&lt;br /&gt;
&lt;br /&gt;
[flankingBonus]&lt;br /&gt;
{&lt;br /&gt;
  defaultMode=1;  // defaults to 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===flankingBonusDir===&lt;br /&gt;
This is the direction where the armor is facing; where damage is least.  It is in the form of a standard spring vector.  In global coordinates mode, &amp;lt;x,y,z&amp;gt; = East, Up, South.  In unit coordinates mode, &amp;lt;x,y,z&amp;gt; = Left, Up, Front.&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMax===&lt;br /&gt;
the maximum damage, when hit from the oppisite direction from flankingBonusDir&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMin===&lt;br /&gt;
the minimum damage, when hit from the same direction as flankingBonusDir&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMobilityAdd===&lt;br /&gt;
This defines the ability of 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 flankingBonusDir to find the new direction of flankingBonusDir.  As an example, if flankingBonusMobilityAdd is .1, after 20 seconds the mobility will have added up to 2, meaning that the added direction has 2x the influence as the previous, and the new direction will roughly match the attack.&lt;br /&gt;
&lt;br /&gt;
===How damage is calculated===&lt;br /&gt;
It uses the dot product of the attack direction and flankingBonusDir to find where the damage falls between max and min.  If you don&#039;t know what that is, it doesn&#039;t matter.  Basically, this is equivalent to taking the cosine of the angle between the two directions, and dealing minimum damage at 1, and maximum damage at -1.  flankingBonusDir points in the direction that is best defended, and attacks from there will do a default of 90% damage, and attacks hitting the exact opposite direction do a default of 190% damage.  Attacks in the middle will do 140% damage, and it scales smoothly between all these values.&lt;br /&gt;
&lt;br /&gt;
Currently flankingBonus only uses the direction of the attacker, not the actual projectile, because of the innacuracy of projectiles moving through the hitsphere, something I am working on rectifying.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
coming soon: how to set per-unit in cob&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Units:FlankingBonus&amp;diff=19072</id>
		<title>Units:FlankingBonus</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Units:FlankingBonus&amp;diff=19072"/>
		<updated>2007-11-24T05:45:29Z</updated>

		<summary type="html">&lt;p&gt;Lurker: New page: =FlankingBonus=  ==History==  FlankingBonus is a quick, integrated way to give units a resistance to damage from certain directions.  It started life long ago, in the dark ages of spring, ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=FlankingBonus=&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
FlankingBonus is a quick, integrated way to give units a resistance to damage from certain directions.  It started life long ago, in the dark ages of spring, under the name of BonusShield.  In its default form it hid there, secretly manipulating the damage dealt to units in an attempt to encourage flanking.  And there it worked its special little magic, known to very few, until July of 2007, when the great lurking presence felt it brush by, and exposed bonusShield to the world.&lt;br /&gt;
&lt;br /&gt;
This mysterious code had few parameters at the time, and each one of them was hardcoded.  There was the direction it was facing, that would determine where there would be minimum damage, which started at south.  But it was more complicated than that.  You see, bonusShield could move, and did so by building up a reserve of mobility as time ticked by.  When an attack would hit, it would use this reserve to swing and face the attacker, buying a precious bit of extra health as long as no units could sneak by to the other direction.  But bonusShield had its flaws.  It completely ignored the way a unit was facing, so a unit spinning in place while being shot from the West could recieve minimum damage from each shot.  It was also &#039;mandatory hardcoded crap&#039;, completely unchangeable by any unit settings.&lt;br /&gt;
&lt;br /&gt;
But lo, the lurking presence had a plan: a plan to not only rid the world of the scourge of hardcoded bonusShield, but dreams of something better, something usefull, something that could make a tank&#039;s armor realistic, give units the ability to have variable armor layout at the push of a button, not merely a &#039;bonusShield&#039;, but a flankingBonus, a fully configurable system built out of the ashes of the old.  And so it set to work, making an extensive patch to be applied to spring&#039;s core.&lt;br /&gt;
&lt;br /&gt;
This patch held the ability to banish bonusShield at a modder&#039;s whim, but held so much more for those willing to dig deeper.  Suddenly, direction, mobility, damage levels, and more were all configurable.  A tank could have extra armor in its front, or following the main turret, and click this power on and off in a second.  Rejoicing was farspread, and history books were filled with the inspiring tale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Specifics==&lt;br /&gt;
&lt;br /&gt;
flankingBonus takes the following tags:&amp;lt;br&amp;gt;&lt;br /&gt;
====int flankingBonusMode;====&lt;br /&gt;
0: no flanking bonus&amp;lt;br&amp;gt;&lt;br /&gt;
1: global coords, mobile&amp;lt;br&amp;gt;&lt;br /&gt;
2: unit coords, mobile&amp;lt;br&amp;gt;&lt;br /&gt;
3: unit coords, locked&amp;lt;br&amp;gt;&lt;br /&gt;
====float3 flankingBonusDir;====&lt;br /&gt;
units takes less damage when attacked from this dir (encourage flanking fire)&lt;br /&gt;
====float  flankingBonusMax;====&lt;br /&gt;
damage factor for the least protected direction&lt;br /&gt;
====float  flankingBonusMin;====&lt;br /&gt;
damage factor for the most protected direction&lt;br /&gt;
====float  flankingBonusMobilityAdd;====&lt;br /&gt;
how much the ability of the flanking bonus direction to move builds up each frame&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMode===&lt;br /&gt;
Defaults to what is set in modrules, which itself defaults to 1, the old way.&lt;br /&gt;
Mode 0 is self explanitory.&amp;lt;br&amp;gt;&lt;br /&gt;
Mode 1 builds up the ability to move over time, and swings to face attacks, but does not respect the way the unit is facing.&amp;lt;br&amp;gt;&lt;br /&gt;
Mode 2 also can swing, but moves with the unit as it turns.&amp;lt;br&amp;gt;&lt;br /&gt;
Mode 3 stays with the unit as it turns and otherwise doesn&#039;t move, the ideal mode to simulate something such as tank armor.&amp;lt;br&amp;gt;&lt;br /&gt;
To set the default in modrules.tdf, use the following code:&lt;br /&gt;
&lt;br /&gt;
[flankingBonus]&lt;br /&gt;
{&lt;br /&gt;
  defaultMode=1;  // defaults to 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===flankingBonusDir===&lt;br /&gt;
This is the direction where the armor is facing; where damage is least.  It is in the form of a standard spring vector.  In global coordinates mode, &amp;lt;x,y,z&amp;gt; = East, Up, South.  In unit coordinates mode, &amp;lt;x,y,z&amp;gt; = Left, Up, Front.&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMax===&lt;br /&gt;
the maximum damage, when hit from the oppisite direction from flankingBonusDir&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMin===&lt;br /&gt;
the minimum damage, when hit from the same direction as flankingBonusDir&lt;br /&gt;
&lt;br /&gt;
===flankingBonusMobilityAdd===&lt;br /&gt;
This defines the ability of 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 flankingBonusDir to find the new direction of flankingBonusDir.  As an example, if flankingBonusMobilityAdd is .1, after 20 seconds the mobility will have added up to 2, meaning that the added direction has 2x the influence as the previous, and the new direction will roughly match the attack.&lt;br /&gt;
&lt;br /&gt;
===How damage is calculated===&lt;br /&gt;
It uses the dot product of the attack direction and flankingBonusDir to find where the damage falls between max and min.  If you don&#039;t know what that is, it doesn&#039;t matter.  Basically, this is equivalent to taking the cosine of the angle between the two directions, and dealing minimum damage at 1, and maximum damage at -1.  flankingBonusDir points in the direction that is best defended, and attacks from there will do a default of 90% damage, and attacks hitting the exact opposite direction do a default of 190% damage.  Attacks in the middle will do 140% damage, and it scales smoothly between all these values.&lt;br /&gt;
&lt;br /&gt;
Currently flankingBonus only uses the direction of the attacker, not the actual projectile, because of the innacuracy of projectiles moving through the hitsphere, something I am working on rectifying.&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Game_and_Unit_development&amp;diff=7901</id>
		<title>Game and Unit development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Game_and_Unit_development&amp;diff=7901"/>
		<updated>2007-11-24T05:45:23Z</updated>

		<summary type="html">&lt;p&gt;Lurker: adding a link to flankingbonus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Mod development=&lt;br /&gt;
Mods, next to Maps, is the content used in Spring.&amp;lt;br&amp;gt;&lt;br /&gt;
A mod is simply a combined file containing a small structure of files and directories holding all the data required.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Mod_Development | Mod Development]] wiki is a starting page, linking to very useful information on the files included in a mod, their hierarchy and more.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Almost the entire mod developing is the creation of units. Which isn&#039;t an easy job.&amp;lt;br&amp;gt;&lt;br /&gt;
Information about the creation of units are everywere, but not combined.&amp;lt;br&amp;gt;&lt;br /&gt;
This is a gathered list of all Tutorials and helpfull forums threads I could find:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===General===&lt;br /&gt;
*http://taspring.clan-sy.com/wiki/Create_units - old Wiki&amp;lt;br&amp;gt;&lt;br /&gt;
*[[Mod Development]]&lt;br /&gt;
*[[Mod specification]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[http://taspring.clan-sy.com/phpbb/viewtopic.php?t=6015 What do I need to create a mod]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Unit Development===&lt;br /&gt;
*[http://taspring.clan-sy.com/wiki/Unit_Development Global informations about units]&lt;br /&gt;
*[http://taspring.clan-sy.com/wiki/all units compatible released]&lt;br /&gt;
&lt;br /&gt;
====s3o units====&lt;br /&gt;
* [http://lassie.student.utwente.nl/vliet/springtut.pdf Maestro&#039;s tutorial of Upspring and textures].&lt;br /&gt;
* [[Basic s3o unit making guide]]&lt;br /&gt;
* [[Simple Mod Tutorial]]&lt;br /&gt;
* [[Units:CreateModel|UV Mapping in Wings3D]]&lt;br /&gt;
* [http://spring.clan-sy.com/phpbb/viewtopic.php?t=10947 Texturing Tutorial]&lt;br /&gt;
* [http://spring.clan-sy.com/phpbb/viewtopic.php?t=10612 Wings UV Mapping Tutorial]&lt;br /&gt;
* [http://taspring.clan-sy.com/phpbb/viewtopic.php?p=75495 various things about unit making. (Also contains an illustrated alpha-channel tut)]&lt;br /&gt;
* [http://spring.clan-sy.com/phpbb/viewtopic.php?t=10503 Runecrafter&#039;s 3DS Max UV Mapping Tutorial]&lt;br /&gt;
* [[Trouble-shooting s3o units]]&lt;br /&gt;
&lt;br /&gt;
====Scripting and Animation====&lt;br /&gt;
* [http://taspring.clan-sy.com/phpbb/viewtopic.php?p=132943#132943 GPL-compliant sourcecode, scripting code examples, and other things.]&lt;br /&gt;
* GET/SET MAX_SPEED works once again. GET/SET ACTIVATION also works (which means you can turn radar jamming, energy production, radar, metal proudction, energy/metal use as defined in the fbi off and on via script)&lt;br /&gt;
&lt;br /&gt;
====FBI Files====&lt;br /&gt;
*[[Units:FBI]]&lt;br /&gt;
*[[All_FBI-variable_values:_min,_max,_default,_type|Units:FBI (variables)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====TDF Files====&lt;br /&gt;
*[[Units:Download TDF]] &lt;br /&gt;
*[[Units:Weapons]] : Various informations about weapons&lt;br /&gt;
*[[All_Weapons_variable_values:_min,_max,_default,_type|Units:Weapons (variables)]]&lt;br /&gt;
*[[Weapon Variables]] : This is the most up to date&lt;br /&gt;
&lt;br /&gt;
====Lua====&lt;br /&gt;
*[[Units:LuaCOB]] - how to interface COB with LUA&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
*[[Units:WeaponMainDir]]&lt;br /&gt;
*[[Units:Design]]&lt;br /&gt;
*[[Units:Buildpics]]&lt;br /&gt;
*[[Units:High-poly]]&lt;br /&gt;
*[[Units:Textures]]&lt;br /&gt;
*[[Units:FlankingBonus]]&lt;br /&gt;
*[[Mod Development:Armor]]&lt;br /&gt;
*[[Mod Development:Spawn]]&lt;br /&gt;
*[[Mod Development:Cursors]]&lt;br /&gt;
*[[Mod Development:Archives]]&lt;br /&gt;
*[[Mod Development:Sidepics]]&lt;br /&gt;
*[[CustomExplosionGenerators|Mod Development:Custom explosions]]&lt;br /&gt;
*[[CustomUnitIcons|Mod Development:Custom unit icons]]&lt;br /&gt;
&lt;br /&gt;
====3do units====&lt;br /&gt;
* [http://www.tauniverse.com/forum/forumdisplay.php?s=&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Development:Main&amp;diff=5612</id>
		<title>Development:Main</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Development:Main&amp;diff=5612"/>
		<updated>2007-08-03T00:29:19Z</updated>

		<summary type="html">&lt;p&gt;Lurker: update, clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Outlined below is information on assisting with the development of the Spring source itself.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;small&amp;gt;NOTE: For information about developing a mod (units, maps, etc.) see the [[Mod Development]] page.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below you can find information on how to work with the Spring source in the current mainline (Windows platform) if you like to work on another platform (Linux &amp;amp; Mac) please look at the bottem of this page under &amp;quot;Multiplatform development&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Starting Development==&lt;br /&gt;
To start development, you will need&lt;br /&gt;
#The latest version of the source &lt;br /&gt;
#A good code manipulation program&lt;br /&gt;
#Compiling your modified source&lt;br /&gt;
&lt;br /&gt;
== Keep track what others do ==&lt;br /&gt;
If you develop with others, you need to know what they do. Fisheye is a very handy svn helper, we currently use:&lt;br /&gt;
 http://spring.clan-sy.com/fisheye&lt;br /&gt;
&lt;br /&gt;
===Source Code Documentation===&lt;br /&gt;
A good place to start is the source code documentation, which can be found here: [http://taspring.clan-sy.com/doxygen/ doxygen]&lt;br /&gt;
&lt;br /&gt;
An explanation on how the code is executed in game can be found in the [[Spring Engine Code]]&lt;br /&gt;
page.&lt;br /&gt;
&lt;br /&gt;
===Obtaining the Source===&lt;br /&gt;
&lt;br /&gt;
Update: the latest SVN is at: [https://taspring.clan-sy.com/svn/spring https://taspring.clan-sy.com/svn/spring]&lt;br /&gt;
&lt;br /&gt;
Another option is to manually download it along with the latest released version of the game. However, for serious developers, a better way would be to download the source straight from the subversion (SVN) repository. This will also allow you to make a patch out of the changes you make to the code, and send it to one of the developers with SVN access.&lt;br /&gt;
&lt;br /&gt;
windows SVN clients : [http://subversion.tigris.org Subversion] (Win32-Console), &lt;br /&gt;
[http://www.syntevo.com/smartsvn/index.jsp SmartSVN] (Java) and [http://tortoisesvn.tigris.org TortoiseSVN] (MSI).&lt;br /&gt;
&lt;br /&gt;
assuming that you are using the Subversion svn client you can download the latest SVN source with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;svn.exe checkout https://taspring.clan-sy.com/svn/spring/trunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
it will create a trunk subdirectory in the directory from where you ran it, which will contain the source code root directory which will be later referred to as /taspring&lt;br /&gt;
&lt;br /&gt;
===Learning C++===&lt;br /&gt;
You will need to know C++ to modify or understand Spring&#039;s source code. If you are interested in learning C++, see [[Learning_CPP]]&lt;br /&gt;
&lt;br /&gt;
However please note that badly designed code (code created by a C++ novice for example), even if working will likely not be included in the spring code. Spring is a large project, and therefore it is necessary to stay away from hack jobs and create general solutions to problems.&lt;br /&gt;
&lt;br /&gt;
===Modifying and Compiling the Source===&lt;br /&gt;
&lt;br /&gt;
The build environment on Windows changed a few releases ago to SCONS/mingw&lt;br /&gt;
&lt;br /&gt;
If you will be developing on Windows you are recommended to use SCONS/mingw, using the SVN version.&lt;br /&gt;
&lt;br /&gt;
See [[Development_IDEs]]. You have either to use the SCons build system that is multi platform, or use the vcproj for building spring in Visual Studio 2003 or Visual Studio 2005.&lt;br /&gt;
A list of required libraries as well as pre-built packages of these follows.&lt;br /&gt;
&lt;br /&gt;
*[http://www.boost.org Boost C++ library]&lt;br /&gt;
*[http://www.openal.org OpenAL Audio library]&lt;br /&gt;
*[http://glew.sf.net GLEW (OpenGL extension loading)]&lt;br /&gt;
*[http://www.winimage.com/zLibDll/ zlib + minizip]&lt;br /&gt;
*[http://www.libsdl.org SDL]&lt;br /&gt;
*[http://openil.sf.net DevIL (Image loading)]&lt;br /&gt;
*[http://www.freetype.org Freetype font rendering]&lt;br /&gt;
&lt;br /&gt;
*[http://taspring.clan-sy.com/phpbb/viewtopic.php?p=49257#49257 Pre-Built packages of most of the dependencies].&lt;br /&gt;
*[http://taspring.clan-sy.com/phpbb/viewtopic.php?p=56846#56846 Pre-Built boost for VS8].  *note - probably not needed&lt;br /&gt;
&lt;br /&gt;
*[http://msdn.microsoft.com/directx/sdk/ DirectX SDK] (Windows, Visual Studio C++ only)&lt;br /&gt;
*PlatformSDK (Windows, Visual Studio C++ Only)&lt;br /&gt;
&lt;br /&gt;
The following are for building with SCONS/MinGW&lt;br /&gt;
&lt;br /&gt;
*[http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe Dev-Cpp installer] / [MinGW] Though I would not advise mingw because you have to set it up your self, and this is harder than it sounds.  Note that Code:Blocks mingw setup is not sufficient. *note - dev-cpp seems to have been abandoned&lt;br /&gt;
*[http://www.python.org/ftp/python/2.4.2/python-2.4.2.msi Python 2.4 installer]&lt;br /&gt;
*[http://prdownloads.sourceforge.net/pywin32/pywin32-208.win32-py2.4.exe?download Python win32 extensions installer] &lt;br /&gt;
*[http://prdownloads.sourceforge.net/scons/scons-0.96.1.win32.exe Scons installer]&lt;br /&gt;
&lt;br /&gt;
====Development System Setup====&lt;br /&gt;
&lt;br /&gt;
See [http://spring.clan-sy.com/phpbb/viewtopic.php?p=49257 Compiling spring (mingw and visual studio 7/8)] and [[Installing Visual C plus plus]] for instructions.&lt;br /&gt;
&lt;br /&gt;
*Make sure C:\Python24 and C:\Dev-Cpp\bin are in your PATH environment variable.&lt;br /&gt;
*Make sure a MINGDIR environment variable with value C:\Dev-Cpp exists. (Change paths where appropriate.)&lt;br /&gt;
**Set environment variables by: Start -&amp;gt; Settings -&amp;gt; Control Panel -&amp;gt; System -&amp;gt; Advanced -&amp;gt; Environment variables (for Windows XP).&lt;br /&gt;
*Checkout the TA Spring SVN repository into your working area.&lt;br /&gt;
*You will also need the [http://spring.clan-sy.com/dl/spring-mingwlibs.exe MinGW/DevCPP libs] extracted to your source directory obtained from SVN. ie your-working-path/source/trunk/mingwlibs. Therefore mingwlibs is at the same directory level as AI, lua and the omni directories.&lt;br /&gt;
&lt;br /&gt;
====Running SCONS Configure====&lt;br /&gt;
&lt;br /&gt;
*Open a console (Start -&amp;gt; Run -&amp;gt; cmd.exe -&amp;gt; Run)&lt;br /&gt;
*cd /where you checked it out in the previous step, if you use checked it out on a different drive make sure to change drives with DriveLetter:&amp;lt;enter&amp;gt; first&lt;br /&gt;
*type &amp;quot;scons configure&amp;quot;&amp;lt;enter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gotchas:&lt;br /&gt;
*if you get an error message starting with &amp;quot;EOFError: : env = Environement...&amp;quot;, try deleting the file build/scons_signatures.dblite&lt;br /&gt;
*if you get an error message stating &amp;quot;ImportError: No module named win32file:&amp;quot;, you have probably not installed the python-win32-extensions.&lt;br /&gt;
&lt;br /&gt;
If all proceeds as intended you will see a message similar to: &lt;br /&gt;
&amp;quot;Everything seems OK.  Run `scons&#039; now to build.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Compiling Spring====&lt;br /&gt;
&lt;br /&gt;
* Open a console (Start -&amp;gt; Run -&amp;gt; cmd.exe -&amp;gt; Run)&lt;br /&gt;
* cd /path-to-where you checked it out in the previous step, if you use checked it out on a different drive make sure to change drives with DriveLetter:&amp;lt;enter&amp;gt; first &lt;br /&gt;
* type &#039;&#039;&#039;scons configure&#039;&#039;&#039;&amp;lt;enter&amp;gt;, followed by &#039;&#039;&#039;scons&#039;&#039;&#039;&amp;lt;enter&amp;gt;&lt;br /&gt;
** Refer to &#039;&#039;&#039;scons --help&#039;&#039;&#039; for options that can be passed to scons configure&lt;br /&gt;
* Wait, this will take a while&lt;br /&gt;
* Copy over data files and stuff from official spring to the game dir (where spring.exe is created)&lt;br /&gt;
* Copy missing DLLs from mingwlibs/dll&lt;br /&gt;
* Start developing&lt;br /&gt;
&lt;br /&gt;
If you are using Linux, refer to the [[SetupGuide]] to build Spring and get it running.&lt;br /&gt;
&lt;br /&gt;
==Development Suggestions==&lt;br /&gt;
&lt;br /&gt;
Before starting to make modifications to the source, take a look at the [[development guidelines]] which outlines some important things to think about. To find something interesting to work on, look at the list of [[example projects]]. You can also check the list of [[whois doing what]] to see what others are doing. If you do edit the code, please add [[Doxygen style comments]] to the code, which will then enhance the source code documentation.&lt;br /&gt;
&lt;br /&gt;
===How to get your code included===&lt;br /&gt;
If you create something that you think should be included in the official source tree, you can send an email to the development mailing list shown at [[Linux]] page. Sending your code in the form of a patch (also known as a .diff file), will make the chances of including it in the main code.  Many patches are submitted to [http://spring.clan-sy.com/mantis Mantis].&lt;br /&gt;
It&#039;s also considered standard practice to post one&#039;s modifications in the [http://taspring.clan-sy.com/phpbb/viewforum.php?f=12 development forum] and get feedback.&lt;br /&gt;
&lt;br /&gt;
==Spring Engine TODO list==&lt;br /&gt;
There is a TODO list for developers who want to contribute to the engine itself:&lt;br /&gt;
[[SpringEngineTODO]]&lt;br /&gt;
&lt;br /&gt;
See [[Glossary]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]] [[Category:Source development]]&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Installing_Visual_C_plus_plus&amp;diff=9860</id>
		<title>Installing Visual C plus plus</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Installing_Visual_C_plus_plus&amp;diff=9860"/>
		<updated>2007-08-02T23:36:52Z</updated>

		<summary type="html">&lt;p&gt;Lurker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ok getting the free Microsoft IDE to run is not the easiest task, if you donÃ‚Â´t know what your doing. If you do though its easy easy :D .&lt;br /&gt;
First of all your going to need quite a bit of free Hard drive memory, about 2 gigabytes. Roughly one Gigabyte needs to be free on your windows drive (usually C:).&lt;br /&gt;
&lt;br /&gt;
What I say after this can basically be found on the microsoft page [http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/ here] with links included, so you might as well go there, and just check here if your having problems.&lt;br /&gt;
You first need to install the &amp;quot;Visual Studio C++ 2005 Express edition&amp;quot; . Long name ey? Anyway there are two ways to install: &lt;br /&gt;
#The [http://go.microsoft.com/fwlink/?LinkId=51410&amp;amp;clcid=0x409 online installation], where you download a small installer, which then downloads the files as you install. I advise against this, as it was always moaning about not having this or that windows update. I do run on a Windows 2000 Machine though, so maybe its no problem with XP.&lt;br /&gt;
# Anyway the other (in my opinion: better) way is to download the [http://go.microsoft.com/fwlink/?linkid=54766 Image file] (.img), extract this with an image reader (you can get one free, just google for it). Than all you need to do is run setup/install, and presto ! You donÃ‚Â´t need to install the frills by the way (the Visual Studio Library or the SQL something).&lt;br /&gt;
&lt;br /&gt;
Okay, that was step one.&lt;br /&gt;
Now you need to install the &amp;quot;Windows Platform SDK (Software Developer Kit)&amp;quot;.&lt;br /&gt;
Again there are two ways of installation, same as before. This time though IÃ‚Â´d advise using the [http://www.microsoft.com/downloads/info.aspx?na=46&amp;amp;p=3&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&amp;amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2fa%2f5%2ff%2fa5f0d781-e201-4ab6-8c6a-9bb4efed1e1a%2fPSDK-x86.exe&amp;amp;oRef=http%3a%2f%2fmsdn.microsoft.com%2fvstudio%2fexpress%2fvisualc%2fusingpsdk%2f online installer], as the [http://www.microsoft.com/downloads/details.aspx?familyid=D8EECD75-1FC4-49E5-BC66-9DA2B03D9B92&amp;amp;displaylang=en Image file] was broken (for me anyway).&lt;br /&gt;
&lt;br /&gt;
OK if youÃ‚Â´ve got that done, your almost ready.&lt;br /&gt;
Next you need to follow the [http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/ instructions on the Windows page], manually changing some of the VS C++ 2005 Settings.&lt;br /&gt;
&lt;br /&gt;
After that you need to install the vclibs package and (if you want to compile the source, and not only AIÃ‚Â´s) the directx SDK.&lt;br /&gt;
Also, the VC8 Project file isn&#039;t updated as much as the source code changes, so you might have to look through the SVN log and manually tell it about files added since the last update.&lt;br /&gt;
&lt;br /&gt;
[[Category:Source development]]&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Installing_Visual_C_plus_plus&amp;diff=9859</id>
		<title>Installing Visual C plus plus</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Installing_Visual_C_plus_plus&amp;diff=9859"/>
		<updated>2007-08-02T23:34:00Z</updated>

		<summary type="html">&lt;p&gt;Lurker: revert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ok getting the free Microsoft IDE to run is not the easiest task, if you donÃ‚Â´t know what your doing. If you do though its easy peasy :D .&lt;br /&gt;
First of all your going to need quite a bit of free Hard drive memory, about 2 gigabytes. Roughly one Gigabyte needs to be free on your windows drive (usually C:).&lt;br /&gt;
&lt;br /&gt;
What I say after this can basicly be found on the microsoft page [http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/ here] with links included, so you might as well go there, and just check here if your having problems.&lt;br /&gt;
You first need to install the &amp;quot;Visual Studio C++ 2005 Express edition&amp;quot; . Long name ey? Anyway there are two ways to install: &lt;br /&gt;
#The [http://go.microsoft.com/fwlink/?LinkId=51410&amp;amp;clcid=0x409 online installation], where you download a small installer, which then downloads the files as you install. I advise against this, as it was always moaning about not having this or that windows update. I do run on a Windows 2000 Machine though, so maybe its no problem with XP.&lt;br /&gt;
# Anyway the other (in my opinion: better) way is to download the [http://go.microsoft.com/fwlink/?linkid=54766 Image file] (.img), extract this with an image reader (you can get one free, just google for it). Than all you need to do is run setup/install, and presto ! You donÃ‚Â´t need to install the frills by the way (the Visual Studio Library or the SQL something).&lt;br /&gt;
&lt;br /&gt;
Okay, that was step one.&lt;br /&gt;
Now you need to install the &amp;quot;Windows Platform SDK (Software Developer Kit)&amp;quot;.&lt;br /&gt;
Again there are two ways of installation, same as before. This time though IÃ‚Â´d advise using the [http://www.microsoft.com/downloads/info.aspx?na=46&amp;amp;p=3&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&amp;amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2fa%2f5%2ff%2fa5f0d781-e201-4ab6-8c6a-9bb4efed1e1a%2fPSDK-x86.exe&amp;amp;oRef=http%3a%2f%2fmsdn.microsoft.com%2fvstudio%2fexpress%2fvisualc%2fusingpsdk%2f online installer], as the [http://www.microsoft.com/downloads/details.aspx?familyid=D8EECD75-1FC4-49E5-BC66-9DA2B03D9B92&amp;amp;displaylang=en Image file] was broken (for me anyway).&lt;br /&gt;
&lt;br /&gt;
OK if youÃ‚Â´ve got that done, your almost ready.&lt;br /&gt;
Next you need to follow the [http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/ instructions on the Windows page], manually changing some of the VS C++ 2005 Settings.&lt;br /&gt;
&lt;br /&gt;
After that you need to install the vclibs package and (if you want to compile the source, and not only AIÃ‚Â´s) the directx SDK.&lt;br /&gt;
Also, the VC8 Project file has some outdated include and link directories that your going to have to change.&lt;br /&gt;
&lt;br /&gt;
[[Category:Source development]]&lt;/div&gt;</summary>
		<author><name>Lurker</name></author>
	</entry>
</feed>