Skip to content
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
Cannot retrieve contributors at this time
Spring changelog
(since 85.0 a "!" prefix indicates backward compatibility broke)
(numbers in brackets normally mean the mantis ticket ID)
-- 107.0 --------------------------------------------------------
- when watching a replay, you can now see everybody's whispers
! buildsystem: remove SDL2 headers. Now SDL2 is always required for compiling spring-dedicated / spring-headless / unitsync
- add SyncedPlayerChanged callin: similar to PlayerChanged, not called for demo-watching spectators but available for synced Lua
-- 106.0 --------------------------------------------------------
- allow resurrecting indestructable features
- consider partially reclaimed wrecks nonfresh for area-resurrection commands
! remove undocumented BeamLaser range modifier (provided 30% extra when fired by mobile units)
! remove legacy (COB, though also affecting Lua) hack allowing units with onlyForward weapons to fire regardless of AimWeapon status
- allow CEG trails for crashing aircraft (engine will randomly select from any generators listed in sfxTypes.crashExplosionGenerators)
- DGun weapontype: allow leading (leadLimit for DGun defaults to 0 instead of -1 for back-compatibility)
- Rifle weapontype: obey collision flags
- change default ownerExpAccWeight to 0 for all weapon-types
- remove salvoError multiplier hack for positional and out-of-los targets
- add new UnitDef tag "stopToAttack"
- defs: accept "health" in addition to "maxdamage" (units) or "damage" (features)
- add math.tau
- add sensors.decloakRequiresLineOfSight modrule. If true, sight radius works as a cap for decloak radius
(for example a unit with decloak radius 200 will not be decloaked with a 100 LoS unit in the 100-200 range,
and units with 0 LoS can't decloak others at all regardless of decloak range). Defaults to false.
- add Platform.osVersion; complements Platform.osName
- add Platform.hwConfig
- Script.IsEngineMinVersion now available in all Lua parsing contexts,
most importantly in `defs.lua`
! change {Allow,Unit}Command callin parameters
AllowCommand(..., cmdTag, fromSynced) --> AllowCommand(..., cmdTag, playerID, fromSynced, fromLua)
UnitCommand(..., cmdTag ) --> UnitCommand(..., cmdTag, playerID, fromSynced, fromLua)
- change ProjectileDestroyed callin parameters
(projectileID) --> (projectileID, projectileOwnerID, weaponDefID)
! remove Game.mapHumanName
! remove UnitDefs[i].moveDef.{family,type}
- add UnitDefs[i].moveDef.isSubmarine
- LuaUI now has access to Spring.SetUnitNo{Draw,Select,Minimap} and SetFeatureNoDraw
- let Spring.SelectUnitArray select enemy units with godmode enabled
- let Unit*Collision callins skip engine collision handling if true is returned (from any synced gadget)
- call gadgetHandler:Explosion for unsynced gadgets (but discard the return value)
- allow specifying source by position but target by ID for Spring.GetUnitWeaponHaveFreeLineOfFire
- allow setting terrain-type hardness and name via Spring.SetTerrainTypeData
! add extra boolean return-value to Spring.GetPlayerInfo between 'rank' (#9) and 'customPlayerKeys' (#11)
select(10, Spring.GetPlayerInfo(player)) is now equal to select(4, Spring.GetTeamInfo(
! return the terrain-type index from Spring.GetGroundInfo and Spring.GetTerrainTypeData
these functions now push [number index, string name, ...] rather than [string name, ...]
onto the stack
! change DefaultCommand call order
previously widgets were called first, and if they returned anything, gadgets weren't called at all
now gadgets are called first, then widgets are always called and can override
- add a 3rd param to DefaultCommand callin: the current default command
works with the above: gadgets receive the default engine cmd,
widgets then receive what gadgets returned (possibly engine default)
- add Spring.ClosestBuildPos(teamID, unitdefID, worldx,worldy,worldz, searchRadius, minDistance, buildFacing) -> buildx,buildy,buildz to LuaSyncedRead
- add Spring.GetGlobalLos(allyTeamID) -> bool to LuaSyncedRead
- add Spring.IsNoCostEnabled() -> bool to LuaSyncedRead
- add Spring.SetWind(number minStrength, number maxStrength)
- add Spring.SetTidal(number strength)
- add Spring.GetTidal
- add Spring.GetGameState() -> bool, bool, bool, bool to LuaUnsyncedRead
1) finished loading
2) loaded from a save
3) locally paused (i.e. after entering /pause)
4) lagging wrt expected simframe time
- add Spring.SetUnitUseWeapons(unitID, bool force, bool block), only one of the bools should be true
setting force to true means the unit can fire even when being dead, stunned, a nanoframe, or in build stance
setting block to true means the unit can't fire at all (unless "force" which takes priority)
- add Spring.Set{Unit,Feature}PieceVisible(unit/featureID, pieceID, bool visible)
- add Spring.{Unit,Feature}Rendering.SetProjectileLuaDraw
- add Spring.{Unit,Feature}Rendering.Set{Deferred,Forward}MaterialUniform
- add Spring.{Unit,Feature}Rendering.Clear{Deferred,Forward}MaterialUniform
- add Spring.AddObjectDecal
! rename Spring.RemoveBuildingDecal to Spring.RemoveObjectDecal
- add Spring.GetLuaMemUsage to LuaUnsyncedRead and LuaMenu
returns the number of (kilo-)bytes used and (kilo-)allocations performed
by the calling Lua state individually, as well as by all states globally
- add Spring.GetVidMemUsage to LuaUnsyncedRead
- add Spring.Get{Unit,Feature}PieceTransformMatrices to LuaUnsyncedRead
- add Spring.Ping callout and corresponding Pong callin
- add Spring.GetMapStartPositions callout
- add gl.GetViewRange callout
- add gl.GetScreenViewTrans callout
- add gl.GetScreen{View,Proj}Matrix callouts for legacy compatibility
- add DrawMaterial callin
- add DrawSky and DrawSun callins; available when a map has no skybox defined
- add DrawWater callin
- add DrawGrass callin (enabled by /drawgrass 2; supersedes engine rendering)
- add DrawTrees callin (enabled by /drawtrees 2; supersedes engine rendering)
- make gl.Feature{Raw} able to draw default trees
if drawing multiple trees in a row, use gl.Feature(treeID, true, false)
for the *first* tree and gl.Feature(treeID, false, true) for the *last*
[more efficient; call gl.Feature(treeID, true, true) to render a single
tree with default state]
! remove the $specular named texture
! remove gl.Light, gl.Lighting, gl.Material, gl.ShadeModel
! remove gl.Fog, gl.FogCoord, gl.SecondaryColor
! remove gl.PointSize, gl.PointSprite, gl.PointParameter
! remove gl.TexEnv, gl.MultiTexEnv, gl.TexGen, gl.MultiTexGen, gl.MultiTexCoord
! remove gl.CreateList, gl.CallList, gl.DeleteList
! remove gl.DrawListAtUnit
! remove gl.Shape
! remove gl.EdgeFlag
! remove gl.GetGlobalTex{Names,Coords}
! remove gl.LineStipple
! remove gl.LineWidth
! remove gl.AlphaTest
! remove gl.ClipPlane
! remove {Unit,Feature}Rendering.{SetPieceList,SetMaterialDisplayLists}
! remove LuaMaterial {pre,post}list handling
! remove 'useCamera' LuaMaterial parameter
! remove 'identities' gl.ActiveFBO argument
- add gl.ClipDist(number index, boolean enable) -> nil
- add gl.{Create,Delete,Update,Render}VertexArray
gl.CreateVertexArray(number vertexCount, number indexCount) -> number id | nil
gl.DeleteVertexArray(number id) -> boolean success | nil
gl.UpdateVertexArray(number id, number vertexPos, number indexPos, table vertexData | function updateFunc [, args...]) -> boolean success | nil
gl.RenderVertexArray(number id) -> boolean success | nil
- add gl.GetDefaultShaderSources(string shaderName) -> table | nil
shaderName can be one of {"0", "C", "T", "T4", "TN", "TC", "2D0", "2DT"}
table contains vertex/fragment/... source strings for the respective engine
shader used internally to draw UI elements, etc ("0" means the given shader
only receives position attributes, "C" means it receives colors, "T" means
it receives texture coors, "N" means it receives normals, and "XY" means it
receives X and Y)
- add `VFS.GAME` as a synonym to `VFS.MOD`
- support local-space tracking for dynamic lights added via Spring.Add{Map,Model}Light
the light-definition table should contain a 'localSpace = true' entry to enable this
- move GetConfig* to LuaUnsyncedRead
- Add Spring.SetVideoCapturingTimeOffset() for > 30fps video capturing
- default `defs.lua` now reads a new file, `defs_post.lua`, which
currently filters out movedefs unused by any unitdef (previously
this was done by the engine). You can prevent this filter by adding
the `dont_remove` field to such movedefs. This is useful to make
them available in `Spring.MoveCtrl.SetMoveDef` but beware the perf cost.
- new TextEditing(utf8, start, length) callin, which holds the IME editing composition (
- new SDLSetTextInputRect(x, y, w, h), SDLStartTextInput() and SDLStopTextInput() functions for controlling IME input from Lua
- Add AllowUnitTransport callin. Called when the engine tests whether unit A can transport unit B. Returning true will let
the engine decide, returning false will force the engine to disallow transportation (for this specific call).
- add AllowUnitTransport{Load,Unload} callins for controlling whether unit A can start {un}loading unit B
- add AllowUnit{Cloak,Decloak} callins for controlling whether a unit can become {de}cloaked
- new unit rules param access level, 'typed': between 'inlos' and 'inradar', applicable when the unit has once been in LoS
and continuously in radar since (same rule as `GetUnitLosState(x).typed` and typed engine icons)
- the GiveOrder* family of callouts can now accept a number for command params,
equivalent to providing an array with one member (use it to save on arrays)
- MarkerAdd{Point,Line} now have an extra optional argument (after localOnly: 6th for point, 8th for line):
the playerID of the player who should appear as the author of the drawing (if missing, defaults to the local player).
Only has an effect when localOnly is true.
- add `paralyze.paralyzeDeclineRate` to modinfo, controls how many seconds it takes for EMP to decline by 100%%
- expose `Game.paralyzeDeclineRate` and `Game.paralyzeOnMaxHealth`
- Added tesselation shaders support to gl.CreateShader. New stages have "tcs" and "tes" names and defined similarly to existing
"fragment", "vertex", "compute" stages. Also added gl.SetTesselationShaderParameter to define tesselation parameters from OpenGL
- Added support for Subroutine Uniform (gl.UniformSubroutine, gl.GetSubroutineIndex)
- Added a few OpenGL constants:
They are mostly useful as one of the arguments to the new Lua gl.UniformSubroutine and gl.GetSubroutineIndex callouts.
These are used in SetGeometryShaderParameter callout (formerly known as SetShaderParameter)
The first is mandatory for tesselation to work, the other two are optional and can be used on the OpenGL host side instead of
writing the tesselation control shader.
4) New vertex primitive type GL.PATCHES
! Renamed SetShaderParameter to SetGeometryShaderParameter to avoid confusion
- add font:World{Begin,End,Print} callouts
- add font:SetText{View,Proj}Matrix callouts
- Added VFS.GetLoadedArchives() -> { string archiveName1, string archiveName2 ... }
- Added VFS.GetArchivePath(string archiveName1) -> string archivePathOnDisk
- Added VFS.GetFileAbsolutePath(string vfsFilePath) -> string filePathOnDisk
- Added VFS.GetArchiveContainingFile(string vfsFilePath) -> string archiveName
! VFS.MapArchive, VFS.UnmapArchive and VFS.UseArchive now take archiveName instead of fileName as the first parameter.
- add a 6th return value (feature->reclaimTime) to GetFeatureResources.
- Add `Spring.UnitFinishCommand(unitID)`, finishes current command. Unlike CMD.REMOVE it works with Repeat/UnitCmdDone
and unlike CommandFallback it works on builtin engine commands.
- Allow spawning of any CEG from any LUS:
EmitSfx(p, "cegTag") param will emit the CEG with tag="cegTag"
EmitSfx(p, SFX.GLOBAL | cegID) will emit the CEG with id=cegID
Added Spring.GetCEGID("cegTag") to get CEG id from tag
- Added Spring.GetUnitCurrentCommand(unitID [, cmdIndex]) -> [cmdID, cmdOpts (coded), cmdTag[, cmdParam1[, cmdParam2 ... ]]]
Returns the index-th command in the unit's queue (or nil). Note: cmdOpts are represented by a single number
(usually a table otherwise), and params are returned on the stack as well. This function allocates no tables.
! make Spring.Get{Unit,Factory}Commands always expect a second argument
! Spring.GetTeamInfo: switched the last two return values around (incomeMultiplier is now 7th, customKeys is now 8th)
- Added a second boolean parameter to Spring.Get{Player,Team}Info, if it is false the function will not return
the (now) last return value, the customKeys table (allocation optimisation)
! Spring.GetUnit{Armored,IsActive} now works on enemies in LoS
! Spring.GetUnitMass no longer works on enemies outside of LoS
! remove Spring.{Set,Get}UnitTravel
! remove Spring.SetUnitToFeature (use the AllowFeatureCreation callin to block features from being spawned)
- Added a boolean parameter to Spring.GetCameraState, if set to false it will return the current camera name
and then the following camera-specific values on the stack:
fps, rot -> oldHeight
ta -> height, angle, flipped
spring -> rx, ry, rz, dist
free -> rx, ry, rz, vx, vy, vz, avx, avy, avz
ov -> (nil)
- Spring.SetUnitWeaponState with "autoTargetRangeBoost" now also lets Cannon
and StarburstLauncher weapons look ahead and pre-aim at targets just
outside of nominal range.
- reveal unit's captureProgress, buildProgress and paralyzeDamage params through
skirmishAiCallback_Unit_get{CaptureProgress,BuildProgress,ParalyzeDamage} functions
! buildsystem: rename engine-legacy to engine-opengl4
- dedicated server now defaults the `AllowSpectatorJoin` springsetting to false (still true for non-dedi)
- Rifle weapontype: remove hardcoded particles
- add MapConvNG executables to official spring builds:
- remove joystick support
- detect hangs during filesystem initialisation
- fix stale thread-id cache in watchdog after reload
- make LuaVFSDownload rescan archives in main thread, and do so when a download finishes (not when one starts)
- account for raw search in AICallback::GetPathLength
- use hidden window for offscreen context rendering
- add /hang command
- add /luagccontrol command
- add /netping command
- add /netmsgsmoothing command
- add /distsortprojectiles command
- add /{more,less}grass and /drawgrass commands
- remove Basic{Sky,Water,TreeDrawer} (3DTrees is now always 1)
- remove /DynamicSky command and keybinding
- remove /{More,Less}Clouds commands
- remove 3DTrees config-setting
- remove /adv{map,model}shading commands
- remove Adv{Map,Unit}Shading config-settings
- remove ForceDisableShaders config-setting
- remove Use{V,P}BO config-settings
- remove LuaShaders config-setting
- remove legacy InfoTexHandler
- mandate GLSL support
- throw out legacy load-screen code (replaced by LuaIntro)
- change PitchAdjust config-setting from a boolean to an integer
0 disables, 1 scales pitch by the square root of game speed, 2
scales linearly with game speed
- `/nocost` now accepts 0/1 parameter (still toggles if none given)
- model metadata for assimp/obj can now define pieces hierarchy
by either nested tables or 'parent' key.
- IME editing support for those with the proper SDL2 version/IME tool combination
! Made lockluaui.txt obsolete: no longer necessary for it to exists in order to enable VFS for LuaUI
- use SHA2 rather than CRC32 content hashes
! blank map params: new_map_x and new_map_y are now in map dimension sizes rather than map dimension * 2. new_map_z renamed to new_map_y
- fix #1968 (units not moving in direction of next queued [build-]command if current order blocked)
- fix #6060 (Max{Nano}Particles=0 still allowing 1 {nano}particle to spawn)
- fix #6059 (units with high turnRate/brakeRate/acceleration moving unexpectedly)
- fix #4268 (add Spring.AddObjectDecal)
- fix #4755 (wrong usage of addr2line on FreeBSD)
- fix #4945 (add Spring.GetMapStartPositions)
- fix #4724 (Spring.SetUnitNeutral not informing any attackers)
- fix #5864 (gunships not limited by maxVelocity when colliding with terrain)
- fix #4515 (aircraft jitter when moving and turning)
- fix #6048 (falling features shaking on the ground instead of fully stopping)
- fix #6046 #5326 #5222 #4663 (spurious camera position change if entering MMB mode while moving cursor)
- fix #6019 (Spring.IsAABBInView bug)
- fix #6038 (noExplode weapons not obeying SetUnitWeaponState("range"))
- fix #6036 (no method to detect MMB camera-pan mode)
- fix #5956 (inverted mouse camera panning for Windows 10 Pro users)
- fix #6022 (uniformArray not initializing array-uniforms in gl.CreateShader)
- fix #6012 (air-transports not unloading properly)
- fix #6010 (HoverAirMoveType aircraft ignoring smooth-mesh when idle)
- fix #6009 (aircraft landing on damage-dealing water when idle)
- fix #6007 / #5989 (desyncs on CMD_UNLOAD_UNITS)
- fix #5993 (voidwater triggering water explosion effects)
- fix #5247 (maximized minimap producing graphical glitches)
- fix #5962 (minimap viewport rectangle larger than what actual screen shows)
- fix #5965
- fix #5977 (log-system memory corruption)
- fix #5964 (shields occasionally letting projectiles pass)
- fix #5948 (memory corruption with LoadingMT=1)
- fix #5947 (PFS failure if starting square inside concave corner)
- fix #5934 (crash on malformed build-commands)
- fix #5923 (wrong external format passed to gl{BuildMipmaps,TexImage2D})
- fix #5927 (memory corruption in text-wrapping)
- fix #2127 (units chasing after full transports)
- fix #4972 (builders doing redundant movement to clear build-sites)
- fix #5207 (units not following waypoints)
- fix #2354 (Spring.GetUnitWeaponState not matching Spring.SetUnitWeaponState due to experience)
- fix #5841 (allow setting colour of area selection for custom commands)
- fix #5884 (treat collidee as attacker on unit <-> unit collisions for UnitPreDamaged)
- fix #5716 (add Weapon::{avoid,collision}Flags to Spring.{Get,Set}UnitWeaponState)
- fix #5652 (maneuverBlockTime aircraft control parameter)
- fix #1225 (inaccurate preview range-rings)
- fix #5870 (zero-based months in rotating infolog filenames)
- fix #5862 (Spring.DestroyUnit + Spring.CreateUnit not supporting persistent ID's)
- fix #5860 (units failing to aim uphill at targets near cliff edges)
- fix #5863 (too strict matrix orthonormality check)
- fix #5855 (memory corruption when loading models)
- fix #5852 (units chasing after auto-generated targets going out of range even on hold-pos)
- fix #5854 (broken default formation-move visualization)
- fix #5851 (DynamicWater crash if foamTexture specified as .dds file)
- fix #5850 (squished loadscreens with BumpWater enabled)
- fix #5806 (CEG spikes from underwater explosions drawn on water surface)
- fix #5820 (broken by 3bd78acb00cab732af4278ed324c7ee5dbc7c517)
- fix #5805 (broken water reflections in FPS camera mode)
- fix infinite backtracking loop in PFS
- fix #5814 (broken slopemap indexing for terrain buildability tests)
- fix #5803 (move goals cancelled when issued onto blocked terrain)
- fix Spring.{G,S}etConfigFloat not being callable
- fix Spring.GetPlayerRoster sometimes excluding active players
! deprecate IsSpringReleaseVersion() / GetSpringVersionPatchset()
! remove a lot of deprecated functions
-- 105.0 --------------------------------------------------------
- special maintenance release: contains only bugfixes
-- 104.0 --------------------------------------------------------
- Add LuaMenu - an unsynced stripped down Lua environment that starts before the game is loaded and persists through reload
this environment receives the Draw{Genesis,Screen,ScreenPost} callins as well as
a special AllowDraw FPS limiter which enables these if true is returned from it
(otherwise they are called once every 30 seconds)
! make GL3.0 the minimum required OpenGL version; Intel G45's and other relics are now banned
(any driver that claims support for this *and* shaders is allowed to run Spring unimpeded)
- improve memory management so Spring.Reload can be safely called multiple times in a row
- kill various desyncs that slipped into 103.0
- Assorted bugfixes and optimisations
- force regeneration of ArchiveCache
- Implement VFS modes - VFS.MOD, VFS.MAP & VFS.BASE now actually work. Added VFS.MENU
! base archives now have modtype of 4 and menu archive have modtype of 5
! one letter command-line flags (e.g. -g instead of --game) are removed
- generally more detailed error-logging
- continued internal cleanup and C++11 adoption to reduce unnecessary data copying and allocing
- don't load-then-immediately-free the LuaGaia handler if neither (synced or unsynced) entrypoint exists
- don't record non-essential profile data in the background if not in /debug mode; reset profiler on reload
- replace dozens of STL containers with faster custom alternatives
- use pooled memory allocations in several engine components
- make Use{V,P}BO=0 reuse buffers when downsized
- recycle audio-stream buffer memory
- recycle demo-streams across reloads
- write demos before destroying game on shutdown in case the latter CTD's
- do not spawn VFS initialization threads if WorkerThreadCount=0
- rebase ThreadPool on a lock-free taskqueue; make IO-bound work unable to block execution of other tasks
- reduce ThreadPool worker-count right after VFS initialization
- asyncify writing screenshots via ThreadPool
- asyncify demo/savegame compression
- disable hang-detection when showing a message box
- defer loading *Def sounds until simulation asks for them
- use pcall in LuaUtils::Echo
- catch all exceptions in Game::Load and make it non-interruptable
- turn LoadDefs content_error exceptions into clean exits
- set modType to an integer (not string) value in base-content modinfo.lua's
- do not auto-add springcontent dependency to non-game "mod" archives
- downgrade non-writeable springsettings.cfg's to a warning
- allow maps to not supply a type-map; one fewer exception to worry about
- improve RNG statistical quality; sampled ints can now also exceed 0x7fff
- make the *nix CrashHandler compile on ARM; do not use cpuid on non-x86 builds
- enable compilation without streflop
- change ForceShaders to ForceDisableShaders (which does the opposite)
- add UseLuaMemPools config-option
- add ForceCoreContext config-option
- add ForceSwapBuffers config-option
- add ForceDisableClipCtrl config-option
- add NETMSG_LOGMSG for synced logging
- netlog Lua memory allocation failures
- netlog model parsing failures
- netlog SHA512 digests over cached path-estimator data
- enforce a minimum of 1GB free disk-space (to prevent cache corruption)
- log 'Warning: Dropping packet from unknown IP' only once per IP
- filter out consecutive duplicated log-messages; add LogRepeatLimit config-option
- fix inverted los-test logic in AI GetProperty callback (patch by rlcevg)
- fix memleak in generated C++ AI interface (patch by rlcevg)
- fix ResourceHandler memleak (patch by rlcevg)
- save SkirmishAI data in separate streams (patch by rlcevg)
- wrecks in water emit bubbles instead of smoke (patch by Sprunk)
- store path-estimator cache files as; forces a refresh
- delete cached path-estimator data which can not be opened or read successfully
- integrate custom selection volumes; also support subtable-based {col,sel}volume definitions
- refactor the object death-dependency system
- trim unused AssParser root-piece transform overrides;
'rotAxisSigns' and 'rotAxisMap' from 95.0 are also gone
- rip out DynamicSun
much more convincing day / night cycles can be completely and more cleanly
(re-)implemented in Lua with Spring.SetSunLighting, Spring.SetSunDirection,
and Spring.SetAtmosphere
! Sonar will now detect ships/hovers - this is since los can't raycast through water.
note that wobble still exists without LoS.
- add 'collideFireBase' weapondef flag
- allow manually sharing nano-frames (patch by Sprunk)
- share unfinished buildees if factory changes team (patch by Sprunk)
- prevent building from dead factories (patch by CommanderSpice)
- restore randomized circling behavior for air-constructors (patch by CommanderSpice)
- UnitExperience is called based on regular exp difference, not limExp (patch by Sprunk)
- set defBaseRadarErrorMult back to 2 instead of 20 (patch by Sprunk)
- expand CEG underground-test lenience from 1 to 20 elmos (patch by Sprunk)
- allow but do not enable staggered LOS updates
- do not hard-assign floatOnWater=true for hovers and ships
checks for this property now first query a unit's MoveDef
(if any) so that ship->tank and similar substitutions via
MoveCtrl.SetMoveDef behave as expected
- disable randomized hovering during CMD_LOAD_UNITS for air-transports
- make Spring.CreateUnit smarter (patch by Sprunk)
if a builderID parameter is passed to Spring.CreateUnit, the new unit
will consider that its solo-builder if it has canBeAssisted=false set
- EMGCannon now obeys flightTime override (patch by Sprunk)
- allow setting runtime/initial firestate to 3 [FIREATNEUTRAL] from COB and unitdefs (patch by Sprunk)
- change a weapon reaiming-tolerance constant from 20 radians to 20 degrees (patch by Sprunk)
- experiment with larger medium-resolution PFS blocksize (16*SQUARE_SIZE vs 8*SQUARE_SIZE)
- bump the default unloadSpread multiplier from 1 to 5
- incorporate native "raw move" (straight-line path) support
inert by default; enable by adding allowRawMovement = true
to a MoveDef table
! Undeprecate {unit,feature}def.modelname and add .modeltype and .modelpath to
allow reading these without loading the model. Removed def.model.{name,type,path}
so they aren't used accidentally.
! The callins GameStart and GamePreload won't be called when a saved game is loaded
- Add VFS.AbortDownload(id) - returns whether the download was found&removed from the queue
- Add Spring.Get{Game,Menu}Name to LuaUnsyncedRead, so LuaMenu and unsynced Lua handles know about each other
- Add new callins (LuaMenu only):
ActivateMenu() that is called whenever LuaMenu is on with no game loaded.
ActivateGame() that is called whenever LuaMenu is on with a game loaded.
AllowDraw() if it returns false, the next draw call is skipped (only active when a game isn't running)
- Add Spring.{Set,Get}VideoCapturingMode() - this doesn't actually record the game in any way,
it just regulates the framerate and interpolations.
- add Engine and Platform global tables currently containing the following keys:
Engine.version: string
Engine.versionFull: string
Engine.versionPatchSet: string
Engine.buildFlags: string
Engine.wordSize: number
Platform.gpu: string, full GPU device name
Platform.gpuVendor: string, one of "Nvidia", "Intel", "ATI", "Mesa", "Unknown"
Platform.gpuMemorySize: number, size of total GPU memory in MBs; only available for "Nvidia", (rest are 0)
Platform.glVersionShort: string, major.minor.buildNumber
Platform.glslVersionShort: string, major.minor
Platform.glVersion: string, full version
Platform.glVendor: string
Platform.glRenderer: string
Platform.glslVersion: string, full version
Platform.glewVersion: string
Platform.sdlVersionCompiledMajor: number
Platform.sdlVersionCompiledMinor: number
Platform.sdlVersionCompiledPatch: number
Platform.sdlVersionLinkedMajor: number
Platform.sdlVersionLinkedMinor: number
Platform.sdlVersionLinkedPatch: number
Platform.glSupportNonPowerOfTwoTex: boolean
Platform.glSupportTextureQueryLOD: boolean
Platform.glSupport24bitDepthBuffer: boolean
Platform.glSupportRestartPrimitive: boolean
Platform.glSupportClipSpaceControl: boolean
Platform.glSupportFragDepthLayout: boolean
Platform.osName: string, full name of the OS
Platform.osFamily: string, one of "Windows", "Linux", "MacOSX", "FreeBSD", "Unknown"
! Game.{version,versionFull,versionPatchSet,buildFlags} now reside in the Engine table
Engine.wordSize indicates the build type and is either 32 or 64 (or 0 in synced code)
- Spring.SetWaterParams() can now be used without /cheat for modifying unsynced values.
- Implemented gl.GetWaterRendering() to expose access to water rendering variables.
! Removed water rendering parameters from LuaConstGame, as they're no longer const.
- Added Spring.SetMapRenderingParams() for modifying splatTexMults, splatTexScales, voidWater and voidGround.
- Implemented gl.GetMapRendering() to expose access to the map rendering variables.
! Removed voidWater and voidGround constant parameters from LuaConstGame, as they're no longer const.
- add Spring.{Set,Get}{Unit,Feature}SelectionVolumeData callouts
! remove Spring.SetSunParameters and Spring.SetSunManualControl
! remove gl.Smoothing
- add gl.SwapBuffers callout for LuaMenu
- add Game.envDamageTypes table containing {def}IDs of environmental-damage sources (patch by Sprunk)
- add Spring.{Get,Set}ConfigFloat callouts
- add Spring.{Set,Get}{Unit,Feature}SelectionVolumeData callouts
- add Spring.SpawnExplosion callout
- add Spring.SpawnSFX callout
equal to the *UnitScript versions of EmitSFX, but
takes position and direction arguments (in either
unit- or piece-space) instead of a piece index
- add DrawScreenPost callin (patch by ivand/lhog)
Similar to DrawScreenEffects, this can be used to alter the contents of a
frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).
- add DrawWorldPreParticles callin
- add start- and hit-position (x,y,z) arguments to ShieldPreDamaged callin
- math.random is now available during execution of defs.lua
(math.randomseed also exists, but will always be a no-op)
- allow gl.BlitFBO blitting from/to the default FB with userdata FBO's
- bump gl.UniformArray length restriction from 32 to 1024
- add Spring.SetFeatureResources(number metal, number energy [, number reclaimTime [, number reclaimLeft]])
- add Spring.SetUnitPieceMatrix(number unitID, number pieceNum, table matrix)
sets the local (i.e. parent-relative) matrix of the given piece if any of the
first three elements are non-zero, and also blocks all script animations from
modifying it until {0, 0, 0} is passed
(matrix should be an array of 16 floats, but is not otherwise sanity-checked)
- add LUS ChangeHeading callin
- add LUS {Start,Stop}Skidding callins; called when a (ground) unit reacts to an impulse
make the start-skidding threshold ('sqSkidSpeedMult') configurable via MoveCtrl.SetGroundMoveTypeData
- make MoveCtrl.Set*MoveTypeData recognize the 'waterline' key (patch by SanguinarioJoe)
- make Spring.ClearUnitGoal cancel raw movement by default
! reorder AllowStartPosition callin parameters and add teamID
old: clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ
new: playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ
- expose weapon salvo vars to {Get,Set}UnitWeaponState (patch by Sprunk)
- extend Spring.SetFeatureResurrect
old API: arg #2 was parsed as unitdef-name if string
new API: arg #2 is parsed as unitdef-name if string OR unitdef-id if number; arg #4 is parsed as resurrect-progress
- make Spring.SetFeatureResurrect ignore nil for its second arg and allow unsetting the resurrect-target if id=-1
! extend Spring.GetUnitWeaponHaveFreeLineOfFire to take aiming-from coors
old API: Spring.GetUnitWeaponHaveFreeLineOfFire(unitID, weaponNum, targetID | [ tgtPosX [, tgtPosY [, tgtPosZ ]]]])
new API: Spring.GetUnitWeaponHaveFreeLineOfFire(unitID, weaponNum, targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ]]]]]])
(if the srcPos* arguments are all nil, the default aiming location is used as before)
- block getting NoAccessTeam's LoS-state (patch by Sprunk)
- block Spring.GetRadarErrorParams for enemy allyteams (patch by Sprunk)
- implement Path.GetPathNodeCosts
- Spring.GetMouseState now returns a sixth value indicating if the cursor is offscreen
- add Spring.GetGrass(x, y) -> 0|1 to obtain grass map information
! exclude spectators from Spring.GetPlayerList if given a normal (id >= 0) team arg
- add new terrain-mesh renderer (faster than existing code, but does not respect cliffs well)
- draw bindpose models non-recursively
- setup alpha-masking for 3DO shadows
- bump ROAM node-pool size for more demanding maps
- limit number of ground-scar decals to 4096
- fix jagged shadows on maps with oblique sun-directions
- fix grass not receiving shadows; unify groundShadowDensity application
- fix grass being rendered black in metal-view
- fix particle shadows
- use clip-control (when possible) to improve depthbuffer precision
- micro-optimize LuaMatBinSet sorting
- make shader-flag handling more lightweight
- do not parse info-textures bound to shaders every single frame
- nuke {point,line}-smoothing options; selected primitive AA is obsolete with multisampling
- outsource vsync regulation to SDL2
- show a splash-screen while initializing VFS; randomly chosen from any
.png or .jpg images found under SplashScreenDir defined in springsettings.cfg
(if SplashScreenDir is a relative path, Spring's CWD will be prepended)
- Add FPSClampPos config for whether the engine should verify the camera doesn't hit ground/go too far
this and other FPS camera configs can be changed midgame and will affect the next frame drawn.
- Add OverheadMaxHeightFactor config - a float multiplier for maximum overhead camera height.
- skip the IsAbove test/callin for input-receivers when mouse is offscreen
- show warning if VMware Mesa drivers are installed
- avoid "Invalid thread number 0" errors if window creation fails
- rename the 'minimised' CLI flag to 'hidden'
- prevent window from being considered unresponsive during startup
- make shift+esc drop to LuaMenu from PreGame
! fix window-state restoration
the WindowState config-setting is gone, a maximized
non-fullscreen window now gets restored by checking
if the resolution previously written is maximal (for
minimized windows the state is not saved, as before)
- fix VRAM size detection
- coax more information out of systems that fail OpenGL context-creation
- add fallbacks for common context-creation failures; catch inadequate
desktop video-modes; turn exceptions during {window,context}-creation
into friendlier popups
- remove old warnings about junk GPU drivers that can no longer appear
- downgrade from throwing exception to warning for missing scar-textures
- extend and organize the information shown in /debug
! rename '/roam' to '/mapmeshdrawer' which cycles through the renderers
- add '/debugglerrors' command (enables per-frame glGetError reporting)
- add '/debuggl x y z' command (requires DebugGL=1) where x=source,y=type,z=severity
- add '/wire{model,sky,tree,water}' debug commands
! change default bindings for chatswitch* actions
alt+ctrl+(a,a) now toggles chatswitchally
alt+ctrl+(s,s) now toggles chatswitchspec
chatswitchall now has to be bound manually
- allow area commands to be extended off-map
- fix tracking-mode with Free camera
- fix LuaParser thread-safety
- fix ProfileDrawer thread-safety
- fix ScopedMtTimer thread-safety
- fix LosMap thread-safety
- fix PathTexture thread-safety
- fix RoamMeshDrawer thread-safety
- fix LuaVFSDownload thread-safety during reload
- fix deadlocks in Windows crash-handler
- fix race-condition between screenshot counter and libIL
- fix sound-thread occasionally accessing a deleted pointer on exit
- fix sound-buffer deletion while buffers were still bound to sources
- fix double-free in CBitmap's move-ctor for DDS images
- fix wrong number of pool-threads being spawned on reload
- fix runaway Text::WrapInPlace string-allocation
- fix FarTextureHandler performance-stalls
- fix potential segfault in SolidObjectDef::GetModelRadius
- fix degenerate GroundFlash quads
- fix ExploSpike projectiles instantly disappearing if they collided with anything on creation
- fix potential gsRNG.Next*() eval-order desync
- fix OOB memory-read in GameSetup::LoadTeams
- fix map-damage explosions being processed twice
- fix explosions causing terraform-spikes on certain maps
- fix UnitDamaged events following UnitDestroyed
- fix BuilderCAI crash when parsing invalid build-commands
- fix canBeAssisted-check in Builder::StartBuild
- fix ATI uniform-type validation for LuaMaterials
- fix ATI driver crash with BumpWater (on any map without a coastline) in TextureAtlas generation
- fix crash in AdvTreeDrawer on ARB-only junkware
- fix crash in InfoTextureHandler on ARB-only junkware
- fix PlayerRoster causing memory corruption on reload
- fix random WaitingDamage memory corruption
- fix Light::ClearDeathDependencies memory corruption
- fix CollisionHander::MouseHit not taking relMidPos translation into account
- fix LosHandler::UnitLoaded removing LOS from non-stunned units
- fix calling alSourcePlay even if alSourceQueueBuffers produced an error
- fix CheckEnlargeDrawArray for VA_TYPE's larger than 10 floats
- fix crash if unit is assigned an empty COB-script
- fix potential buffer-overflow in GetFeatures AI callback
- do not bitshift negative values (undefined behavior)
- catch invalid CmdDesc indices in GuiHandler::DrawButtons
- insert missing eventHandler.RemoveClient call in RoamMeshDrawer
- fix #5759 (units flip-flopping between paths due to path-estimator expanding unreachable nodes)
- fix #5778 (crash when reloading with QTPFS)
- fix #5730 (crash during nano-particle creation by builders under specific circumstances)
- fix #5728 (canBeAssisted=false factories only being buildable by one constructor at a time)
- fix #5721 (structures created via AI orders sometimes not leveling ground)
- fix #5715 (zero-spread weapons avoiding non-target enemies)
- fix #5690 (Spring.GetProjectileTarget returning <0,0,0> for cannons with ground-attack orders)
- fix #5519 (path-estimator failure if start- and goal-coordinates mapped to the same block)
- fix #5684 (Spring.{Add,Remove}Grass updates not taking effect until camera is moved)
- fix #5658 (projectiles applying two position-updates while bounced)
- fix #5630 (free line-of-fire detection failure)
- fix #5287 (help units in firebases with a collideFireBase weapondef flag)
- fix #2970 ("pushResistant" is now accepted by MoveCtrl.SetGroundMoveTypeData)
- fix #3515 (better error-messages for the /team command)
- fix #5200 (broken ctrl+mousewheel tilt transitions with 'Spring' camera)
- fix #5258 (custom selection volumes)
- fix #5632 (don't show just a black screen on startup)
- fix #5629 (make footprint-terraforming respect buildee's actual facing)
- fix #4447 (FPS-mode locking onto out-of-LOS units)
- fix #4074 (equalize UnitDamaged parameters for LuaUI and LuaRules)
- fix #2855 #5092 #5180 (jagged terrain shadows)
- fix #5619 (area-commands not drawn on minimap)
- fix #5617 (enable non-binary alpha-testing for unit icons)
- fix #5684 (Spring.{Add,Remove}Grass updates not taking effect until camera is moved)
- fix #4164 (shield{Good,Bad}Color are RGBA float4's now)
- fix #5587 (units in sharp holes sinking underground if also skidding)
- fix #5502 (crash with malformed build-commands)
- fix #4723 (EmitSfx crash when referencing effect not defined in unitdef)
- fix #4940 ("Recompressing Map Tiles with ETC1" load-stage triggering watchdog)
- fix #5403 (extra ShieldPreDamaged parameters)
- fix #5056 (let Spring.GetUnitWeaponHaveFreeLineOfFire take firing location as an argument)
- fix #5188 (units refusing to move if ordered to non-reachable locations from factory)
- fix #5639 (stunned transports not updating the position of their cargo)
- fix #5304 (invisible collada models if no secondary texture provided)
- fix #5318 (.ogg audio streams playing too fast)
- fix #5358 (theoretical desync with std::{strtod,atof})
- fix #5457 (TargetBorder broken for non-box collision volumes)
- fix #5411 (PFS not finding optimal paths on maps with extreme speed-modifiers)
- fix #5501 (PFS ignoring obstacles higher up or lower down cliffs)
- fix #5469 (overflow-FPE in GetHeadingFromVectorF)
- fix #5476 (assertion-failure with broken springcontent installation)
- fix #5434 (add logging to detect unicode-aware libIL)
- fix #5387 (GroundDecalHandler crash on exit)
- fix #5421 (Spring.SendCommands("ctrlpanel") crash if sent inside a callin)
- fix #5412 (GameRulesParams persisting through Spring.Reload)
- fix #5493 (crash while reloading with LoadingMT=1)
- fix #5463 (failing to connect to server sends user back to LuaMenu)
- fix #5544 (classified)
- fix #5468 (classified)
- fix #5461 (classified)
- fix #5404 (MoveCtrl.SetGunshipMoveTypeData crash if called for a non-gunship unit)
- fix #5483 (glDeleteList called from multiple threads)
- fix #5423 (random number generation in defs.lua)
- fix #5396 (units lacking sensors on fire-platforms)
- fix #5339 (crash when placing a geothermal)
- fix #5338 (grid-patterns in unsynced heightmap)
- fix #5644 (send BuggerOff notes from opened-but-blocked factories again)
- fix #4745 (broken transport-unloading with non-zero unloadSpread)
- fix #4971 (constructors not assisting if simultaneously given orders to build count-restricted units)
- fix #4481 (check MoveDef maxSlope for units built by mobile constructors)
- fix #4827 (idle gunships jiggling away from their position)
- fix #4232 (gunships snapping to horizontal attitude when ordered to stop after attacking)
-- 103.0 --------------------------------------------------------
- Fix & Improve performace
- Add 'allowTake' modoption (default: true) to enable/disable /take (by lamer)
- Add onlyLocal boolean value to modinfo.lua (default false)
If true, spring won't listen for incoming connections when running
this game unless GAME\OnlyLocal is specified in the start script.
- Add new UnitDef tag "buildingMask" and LuaSyncedCtrl function "SetSquareBuildingMask". (by ivand)
Both used in conjunction to allow/disallow construction of certain unit types (via setting buildingMask)
on certain tiles (via SetSquareBuildingMask). By default all tiles and buildings have mask of 1
- Ghosted buildings are now consistent when changing specTeam/specFullView
- Fix #5301 (Units with restricted firearcs do not turn to aim)
- Fix #5302 (extreme slowdown)
-- 102.0 --------------------------------------------------------
- Fix & Improve LoS performance
! remove LuaModUICtrl config setting
! remove ClassicGroundMoveType
! remove SpringLobby from spring installer
- update model matrices on demand instead of once per frame
! allow units to unstuck themselves from an unpathable square
into an adjacent pathable one
! COB: deprecate unit/team/allyteam/global vars. Use lua functions instead
- prevent accidental friendly fire from direct line of fire weapons
- Add {Set,Get}FeatureRulesParam(s)
! Get{Game,Team,Unit,Feature}RulesParams will now return { paramName = value, ... }
- You can now delete RulesParams by calling Set{Game,Team,Unit,Feature}RulesParam with no value argument or a nil one.
- Add new Spring.ClearUnitGoal(unitID) callout.
- add GamePaused and GameProgress callins to base gadget-handler
- extend builtin uniform binding for custom Lua materials
SEE "fix LuaMaterial uniform management" BELOW FOR THE
- Add Spring.GetFrameTimer(bool synced) to get a timer for the start of the frame
this should give better results for camera interpolations.
- Add an optional weaponNum argument to SetUnitTarget.
- Update shader errorlog even if compilation was successful
- Remove updateMatrix argument in Spring.UnitScript.{Move,Turn} as matrices will be automatically updated if necessary.
- Add new Spring.Start callout for launching a new Spring instance without terminating the existing one. See Spring.Restart for parameters.
- Add new VFS.GetAvailableAIs([gameName] [, mapName])->{ai1, ai2, ...} callout for getting a list of all Spring AIs. The optional gameName and mapName parameters can be used to include game/map specific LuaAIs in the list.
! remove UseCREGSaveLoad and add /LuaSave which generates .slsf files
! compress creg saves
- SaveFile can be specified in start script in order to start from a save
- reduce number of team-color updates for custom shaders
- use frame-extrapolation for smoother feature movement
- draw all model nanoframe stages with shaders by default
- skip drawing icons for void-space units
- disable BumpWaterRefraction = 2 for now.
- make skirmishAiCallback_Unit_getResource{Use,Make} not round their return values to ints
- RulesParams are now accessible through skirmishAiCallback_{Game,Unit,Team,Feature}_getRulesParamValue{String,Float}
- make the time server spends in sleep calls configurable (for dedicated hosts)
- rename the 'ReflectiveWater' config-key to 'Water' (to match the command)
- set the 'GroundDetail' config-val only when it changes, not on shutdown
- add '/GroundDetail <val>' text command to modify ground detail on the fly
- auto-normalize normals and tangents for all AssImp-loaded models
- add a gameDeferredDraw=5 drawMode value (handy for Draw{Unit,Feature} to know)
- fix invisible OBJ models
- fix gl.DeleteShader allowing repeated deletion
- fix drawing of being-built units during deferred pass
- fix invisible ground on voidwater maps when AdvMapShading=0 (in L-view)
- fix Spring.SetSunLighting crash when AdvMapShading=0
- fix Spring.ValidUnitID to accept nils again
- fix wreckage jumping from large *horizontal* impulse
- fix landed HoverAirMoveType aircraft behavior when given a command within their build range
! fix LuaMaterial uniform management for materials with standard and deferred shaders
material tables are now expected to contain subtables defining the uniforms; instead of
"material = {shader = ..., cameraposloc = 123, texunits = ..., ...}"
"material = {shader = ..., uniforms = {cameraposloc = 123, ...}, texunits = ..., ...}"
for a material that has both types of shader, supply "standardshader",
"deferredshader", "standarduniforms", and "deferreduniforms" as keys
new keys for these uniform subtables can be
"viewmatrixloc" // synonym for "cameraloc"
"projmatrixloc" // camera projection
"viprmatrixloc" // camera view-projection
"viewmatrixinvloc" // synonym for "camerainvloc"
"projmatrixinvloc" // camera inverse projection
"viprmatrixinvloc" // camera inverse view-projection
"shadowmatrixloc" // synonym for "shadowloc"
"cameradirloc" // camera forward direction
"sundirloc" // synonym for "sunposloc"
"rndvecloc" // random 3-vector with length in [0, 1)
"simframeloc" // current simulation frame
"visframeloc" // current renderer frame
- fix #5182 (unwanted sun-texture reflections)
- fix #5175 (microscopic FarTexture impostors)
- fix #5166 (wrecks buried underground on maps with negative hardness)
- fix #5165 (rare crash on exit or reload)
- fix #5161 (Spring.IsUnitAllied always returning true in unsynced gadgets)
- fix #5160 (Spring.SetSunLighting not working if applied in *get:Initialize and crashing when AdvMapShading=0)
- fix #5157 (skirmishAiCallback_Unit_get{Pos,Vel} broken with cheats enabled)
- fix #5155 (MoveCtrl.SetRotation not matching Spring.GetUnitRotation)
- fix #5149 (EVENT_ENEMY* AI events not being sent)
- fix #5148 (assertion failure with custom shaders)
- fix #5146 (missing wreckage healthbars)
- fix #5141 (glitchy tree rendering)
- fix #5136 (texture corruption with custom Lua materials)
- fix #5135 (missing SFX.FIRE and SFX.SMOKE effects)
- fix #5134 (broken zoom in track-mode with Spring camera)
- fix #5084 (allow LuaUI self-disabling)
- fix #5131 (order-lines visualization)
- fix #5130 (put projectiles created by Spring.SpawnProjectile in Gaia team)
- fix #5127 (icon-transparency over water)
- fix #5181 (aircraft sometimes fail to land)
- fix #5177 (stack-buffer-overflow in TextWrap.cpp)
- fix #5172 (segfault on assimp loading)
- fix #5173 (air transports fail to pick up units)
- fix #5174 (hover move type tend to exactly land on top of each other)
- fix #5176 (crash in CobThread)
- fix #5106 (Strafe planes dont land when reaching target or on 'stop' command)
- fix #5152 (heap-use-after-free when loading a game)
- fix wrong radar icons when switching specfullview
- fix #5216 Spring.GetVisibleUnits
- fix #5219 pink features & units
- fix #5223 buffer-overflow when using /water
-- 101.0 --------------------------------------------------------
- LoS (sim) overhaul
- SSMF Splat Detail Normal Textures (by Beherith)
- many new Lua rendering related features (custom feature shaders, map shaders, ...)
- many Lua additions
- Lua pr-downloader API
- removal of airbases & fuel
- transport overhaul
- 64bit windows builds
! change default screenshot file type to jpg. to create png use /screenshot png
! pr-downloader dependency is now mandatory (statically linked with spring)
! demo files are now compressed with gzip (and the suffix is .sdfz)
- improve data locality even further with respect to 100.0
- fix memory leaks and misc. crashes (some related to LoadingMT)
- ignore /give commands issued via autohost interface (needs an actual player)
! ModInfo: remove losMul & airLosMul -> always handle los ranges in elmos in the _whole_ engine
WARNING: this also rescales the returned values in Lua UnitDefs!
! ModInfo: make `radarMipLevel` configurable
! change default airMipLevel 2->1 & radarMipLevel 3->2
! ModInfo: add new sensors.alwaysVisibleOverridesCloaked (default _off_! before was always on)
! modrules.lua: add new `separateJammers` tag (breaks backward compatibility!)
default true (old behaviour is false)
when enabled each allyTeam only jams their own units
! get rid of los radius limit (you can now create units that cover the whole map and more)
- speed ups in general
- reduced lags introduced by LoS
- multithread LoS updating
- reduced memory usage
! fix various bugs related to unit/feature movement not registered
! update LoS on terrain changes
! correctly handle the height of the emitter (before radarEmitHeight was always from ground height & similar units on a spot shared their emitHeight)
! make LoS much smoother (now really gets called per-gameframe when the emitter moves)
- better circle algo
- add Spring.SetGlobalLos(int allyTeamID, bool globallos)
! start simulation at frame 0, not at 1
- features now have a non-animated LocalModel and can use per-piece collision volumes
- RockUnit and HitByWeapon script callins now take vectors in unit-space
- fix acceleration rates and turn-speed limits for reversing units
- fix units occasionally zipping across the map after being unloaded
- fix unloaded units being non-colliding if transporter script attached them to piece -1
- fix various aircraft landing/midair-vibrating bugs
- fix builders sometimes ignoring their commands if they were issued without shift
- set better default radii for objects (and use same logic in all model parsers)
- make ground-unit reversing logic configurable via Spring.SetGroundMoveTypeData
- fix ground-units forever trying to move along their final waypoint direction in rare cases
- COB: always use the return value of the Killed thread to determine wreck level (none if omitted)
! remap SFX.RECURSIVE piece flag from 1<<8 to 1<<14
! removed hardcoded logic to zombify (stun+immobilize) a unit on death
! airbases and fuel were removed, use custom commands in combination with
Spring.SetUnitLandGoal(unitID, x, y, z [, radius]) and the new transport changes
to implement this functionality in lua.
- every unit can now have other units attached to it using:
- Spring.UnitAttach(transporterID, passengerID, pieceNum)
- Spring.UnitDetach(passengerID)
- Spring.UnitDetachFromAir(passengerID)
- units with transportCapacity > 0 and transportMass > 0 will retain backward compatibility
- added Spring.SetUnitLoadingTransport(passengerID, transportID) which disables collisions
between the two units to allow colvol intersection during the approach.
! fix default drawInMap keyshortcut on german keyboards
- fix displayed tooltip elevation when over minimap
- fix Ready button ignoring clicks after setting startpos and rejoining
- fix potential infinite loop during sound initialization
- new Shatter animation (SFX.Explode in Cob/LUS)
- break the piece into parts and not triangles
- much faster (in creation & render time)
- change the trail drawing of some missile projectiles
- add support for SSMF Splat Detail Normal Textures (by Beherith)
- add deferred pass for features; note that these are drawn into
the same buffer as units (overwriting it, unless the new config
variable AllowDeferredModelBufferClear is set to false [default])
- allow custom shaders for being-built units
- allow custom Lua map shaders
- fix metal->los info texture switching visual harshness
- apply anisotropic filtering to all mipmapped SSMF textures
- fix shadow-pass (and general) terrain/model visibility culling
- fix environment reflections (broken in four different ways)
- fix DynamicWater artifacts at large viewing distances
- fix RefractiveWater not showing submerged objects with DualScreenMinimapOnLeft
- fix truncation of deferred model normals
- do not disable model shaders during world alpha-pass
- do not disable model shaders during water ref{le,ra}ction passes
- always draw water surface during alpha-pass
- kill shadows for fully alpha-faded features
- kill impostors for fully alpha-faded features
- write extraColor to the specTex target on the deferred side of ModelFragProg
- use groundSpecularColor when no specularTex exists (i.e. on basic SMF maps)
- shift ground decals visually so they are always aligned with objects
- render all types of decals with shaders
- draw custom commands that have two parameters
! nuke support for "special" Spring{Radius,Height} pieces in assimp models
- speedup gameserver exiting (reduced some io/net related sleeps)
- fix cases where either no path was returned or an incorrect one
- switch to octile heuristic to reduce number of explored nodes
- increase high-resolution search range
- fix diagonal movement cost estimation
- handle PathCache crc failures
- make QTPFS neighbor updates a bit faster
- plug several memory leaks in engine interface and wrappers
- bring ghost model drawing in a usable state again
- add sensor map callbacks
- add shield state callbacks
- add ground info callbacks
- make feature callbacks respect cheats
Lua Callins:
! GameID callin now gets the ID string encoded in hex.
! new Lua callin RenderUnitDestroyed is now called just before a unit is
invalid, after it finishes its death animation.
! ShieldPreDamaged will now be called for LightningCannon and BeamLaser.
Two new arguments were added: beamCarrierWeaponNum and beamCarrierUnitID.
These will be populated in place of the first argument (projID).
! The following callins will now have 1-based weapon index arguments:
! UnitCommand and UnitCmdDone argument order changed to be consistent with
each other and with CommandFallback & AllowCommand: (unitID,
unitDefID, unitTeam, cmdId, cmdParams, cmdOpts, cmdTag)
Note that UnitCommand will now receive cmdOpts as a table and not as a number
- new callin UnitReverseBuilt, called when a living unit becomes a nanoframe again
- add new callins DrawGroundPreForward and DrawGroundPreDeferred
these run at the start of their respective passes when a custom
map shader has been assigned via Spring.SetMapShader (convenient
for setting uniforms)
- add new callin DrawGroundPostDeferred; this runs at the end of its
respective deferred pass and allows proper frame compositing (with
ground flashes/decals/foliage/etc, which are drawn between it and
DrawWorldPreUnit) via gl.CopyToTexture
- add new callins DrawUnitsPostDeferred and DrawFeaturesPostDeferred
these run at the end of their respective deferred passes to inform
Lua code it should make use of the $model_gbuffer_* textures before
another pass overwrites them (and to allow proper blending with e.g.
cloaked objects which are drawn between these events and DrawWorld
via gl.CopyToTexture)
NOTE: the *PostDeferred events are only sent (and only have a real
purpose) if forward drawing is disabled, whereas the DrawGroundPre*
events are only sent if the map has a custom shader!
! los related UnitDefTags are now in elmos
! Lua{Feature,Unit}Defs:
make the "model" subtable available (as it is for LuaUnitDefs)
move the {min,max,mid}{x,y,z} values to this table (these can now be accessed
using e.g. *Defs[i].model.midx)
deprecate *Defs[i].modelname, use *Defs[i].model.path instead
Lua (lighting):
! Game.fogColor constant is no longer available, use gl.GetAtmosphere("fogColor")
! Game.groundAmbientColor, Game.groundSpecularColor and Game.groundSunColor
are no longer available, use gl.GetSun() instead with appropriate parameters
- add unsynced callout Spring.SetSunLighting(table params) -> nil
It can be used to modify the following sun lighting parameters:
{ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent
example usage: Spring.SetSunLighting({
groundAmbientColor = {1, 0.1, 1},
groundDiffuseColor = {1, 0.1, 1},
- add unsynced callout Spring.SetAtmosphere(table params) -> nil
It can be used to modify the following atmosphere parameters:
fog{Start,End}, {sun,sky,cloud}Color
example usage: Spring.SetAtmosphere({
fogStart = 0,
fogEnd = 0.5,
fogColor = { 0.7, 0.2, 0.2, 1 },
- add unsyced callout gl.GetAtmosphere(name) -> number | number r, number g, number b
Works similar to gl.GetSun(), and can be used to extract atmosphere parameters.
See Spring.SetAtmosphere for details.
Lua (projectiles):
- new Spring.DeleteProjectile(projID) for silently removing projectiles (no explosion).
- new Spring.{Get,Set}UnitWeaponDamages similar to *UnitWeaponState but for damage and explosion values.
- new Spring.{Get,Set}ProjectileDamages similar to the above, for projectiles in flight.
! Weapons with tracking will use a radar dot position unless
Spring.SetProjectileIgnoreTrackingError(projID, bool ignore) is called.
Lua (model rendering):
! reading from gl_TextureEnvColor[0] in custom shaders to set team color
will no longer work, declare a uniform vec4 named "teamColor" instead
(the engine will fill this in for you)
! gl.UnitShape and gl.FeatureShape now take three extra boolean arguments
and set their relevant GL state internally (so that calling only these
functions is enough to get correctly rendered models; pass in 'false'
for the [new] THIRD argument for the fixed behavior, omit it or pass in
'true' [default] to render with your own custom state instead)
the [new] FOURTH argument should be 'true' if in DrawScreen and 'false'
(default) if in DrawWorld; any transforms for these two functions *MUST*
include a gl.LoadIdentity call when argument #3 is false (whether they
are used in DrawWorld or in DrawScreen)
the [new] FIFTH argument determines whether the model is drawn opaque
('true' [default]) or with translucency ('false'); only has an effect
when argument #3 is false
- add callouts Spring.Preload{Feature,Unit}DefModel allowing the engine
to load the unit's model (and texture) in a background thread.
wreckages and buildOptions of a unit are automatically preloaded.
- new Spring.SetFeatureFade(featureID, bool) to control whether a feature will fade or not when zoomed out.
- add Spring.FeatureRendering API; allows custom shaders (technically,
materials) for features as its Spring.UnitRendering counterpart does
for units
note: the following two functions exist but are no-ops
- add callouts
gl.{Unit,Feature}Textures(number objID, boolean enable) -> nil
gl.{Unit,Feature}ShapeTextures(number defID, boolean enable) -> nil
these are primarily intended to be used in conjunction with
gl.{Unit,Feature}(objID, ..., raw=true)
gl.{Unit,Feature}Shape(defID, ..., raw=true)
and apply a model's default textures; easier than gl.Texture("$%...")
- fix LuaUI crash if a widget caused an error in its GetConfigData callin
- fix GadgetHandler miscounting if RemoveGadget was invoked during a callin
- allow custom commands to be non-queueing (handy for state toggles)
- LuaUI can now reload itself via Spring.SendCommands
- allow /lua{rules,gaia} reloading on frame 0
- allow Lua{Rules,Gaia} chat actions before frame 0
- extend Spring.TraceScreenRay to intersect a user-given plane
- add unitSpecularColor to the set of values returned by gl.GetSun
- fix typo in maphelper/setupopts.lua breaking several default options
! do not start camera transitions from Spring.SetCameraState
! LuaSyncedRead::GetAIInfo now returns "UNKNOWN" for non-local AI's, not "UKNOWN"
! {Set,Get}UnitPieceCollisionVolumeData now receive 1-based piece index argument (was 0-based).
! fix a desync related to printf/number2string conversion
! Lua: fix bug that some TransformMatrix functions were revealing the true position of radar dots
! fix Spring.GetUnitPieceDirection() (returns now same dir as GetEmitDirPos)
! Spring.GetUnitPieceInfo() will now set "[null]" as the parent name of the root piece instead of ""
- add Spring.SetGlobalLos(int allyTeamID, bool globallos)
- add Spring.IsUnitIn[Los, AirLos, ...]
Note this is _not_ equal with Spring.IsPosInLos with the unit's pos!
I.e. the ground maybe in radar range, but the unit is jammed and so not visible
- add Spring.GetUnitFeatureSeparation(unitID, featureID[, dist2D])
- add Spring.GetFeatureSeparation(featureID1, featureID2[, dist2D])
- new Spring.GetUICommands function to obtain a list of all UI commands (e.g. /luaui reload)
- new VFS.CalculateHash function that calculates hash (in base64 form) of a given string (with md5 support initially)
- new Spring.{Get,Set}{Unit,Feature}Mass functions
- new Spring.SetFeatureMoveCtrl(featureID [, boolean enable [, number* args]]) to control feature movement
the number* arguments are parsed as follows and all optional
if enable is true:
[, velVector(x,y,z) -- initial velocity for feature
[, accVector(x,y,z) -- acceleration added every frame
if enable is false:
[, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl
[, impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl
[, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl
- add callouts (see their Unit equivalents for documentation)
- add unsynced callout SetSkyBoxTexture(string texName) -> nil
example usage: Spring.SetSkyBoxTexture("")
- add unsynced callout Spring.SetMapShadingTexture(string texType, string texName) -> boolean
example usage: Spring.SetMapShadingTexture("$ssmf_specular", "name_of_my_shiny_texture")
- add unsynced callout Spring.SetMapShader(
number standardShaderID,
number deferredShaderID
) -> nil
(the ID's must refer to valid programs returned by gl.CreateShader;
passing in a value of 0 will cause the respective shader to revert
back to its engine default)
custom map shaders that declare a uniform ivec2 named "texSquare"
can sample from the default diffuse texture(s), which are always
bound to TU 0
- extend the signatures of the Spring.SetDraw{Ground,Models}Deferred
callouts; allows disabling the forward {Unit,Feature,Ground}Drawer
boolean drawGroundDeferred
[, boolean drawGroundForward]
boolean drawUnitsDeferred,
boolean drawFeaturesDeferred
[, boolean drawUnitsForward
[, boolean drawFeaturesForward ]]
expose the following $named textures to LuaOpenGL
"$map_reflection" (same as "$reflection")
"$sky_reflection" (defined for SSMF maps that have a skyReflectModTex)
"$normals" (auto-generated)
"$ssmf_splat_normals" or "$ssmf_splat_normals:X"
'X' can be a value between 0 and 3, defaults to 0 if ":X" is omitted
Lua pr-downloader API:
- VFS.DownloadArchive(name, category)
- DownloadStarted(id)
- DownloadFinished(id)
- DownloadFailed(id, errorID)
- DownloadProgress(id, downloaded, total)
-- 100.0 --------------------------------------------------------
- bugfixes
! Added radar2 los colour for colouring the inside of the radar edge.
- it is changeable through SetLosViewColors (see Lua changes)
- fix visibleShieldHitFrames not read from shield subtable
! scale flighttime with GAME_SPEED and not 32
- warn on unknown tags (so you can de-TA-ism your weapondefs finally)
- weapondefs_post.lua: set legacy weapontype tags to nil, so they don't cause engine warnings
- make little bit more accurate
! SetLosViewColors changed:
- radar2 colour (see Map changes) is required.
- parameters are now in the form of GetLosViewColors output:
(always = {r,g,b}, LOS = {r,g,b}, radar = {r,g,b}, jammer = {r,g,b}, radar2 = {r,g,b})
- changed args of Spring.GetGroundNormal
- new 3rd arg: bool smoothedNormal (default false)
- 4th return arg: float slope
! convert UnitDef::attackSafetyDistance to a key recognized by Spring.SetMoveTypeData
- handle rejected connection attempts (when version differs)
- make path cache part of synced state -> player desyncs right from the start when got an invalid one
- make "MaxParticles" & "MaxNanoParticles" runtime changeable
- fix #4837: hang in linux crashhandler
- fix #4819: ai interface log messages are now logged into infolog.txt
- fix #4882: endlessloop at start when MaxSounds = 0
- unselect AI when game is selected in old menu
- demotool: add more info to dump output
-- 99.0 ---------------------------------------------------------
- new shader based InfoTexture
- new linux crashhandler (by Major Bor3d0m)
- new rotatable default camera
- MASSIVE speedup in lategame rendering (cutting rendertime upto 1.5-3 times!)
- add Spring.Reload(script) to change/map & game without exiting spring
- added lua override for InfoMaps (by enetheru)
- allow to enable isolated mode by creating a file isolated.txt next to spring executable
- internal weapon refactor
- fix particle limit
! removed TW, Orbital & Smooth camera
! add new default camera: Spring camera
- it's a merge of TW & Overhead camera
- it's using [alt] as modifier for rotating the camera (in key & middle click scrolling)
- also can be rotated with the screen edges of the upper 30% of the screen
- add new EdgeMoveWidth & EdgeMoveDynamic config tags
- EdgeMoveWidth: defines the screen edge width used for scrolling
- EdgeMoveDynamic: if scroll speed depends on the distance to the screen edge (default on)
! don't read old config file locations any more:
! add dedicatedValue & headlesValue to confighandler:
! make spring-dedicated listen at as default again
! add headless values from springrc-tempate-headless.txt
- print user's config to infolog
! new linux crashhandler by Major Bor3d0m
- libunwind is required to compile spring on linux
- fix headless compile on systems w/o x11 & SDL
! save windowed size in separate tags (#4388)
- fix crash with intel gpus
- fix bug that caused to recompress groundtextures always to ect1 on intel/mesa even when there was no need for it
- fix #4576: F6 does not sound mute
- fix #4578: backspace key events aren't captured by chat entry mode
- fix #4455: disable in-map draw when user starts writing
- fix #4706: do not ignore next char in ChatActionExecutor
- document keychains in uikeys.txt
- improve default cmdcolors.txt
- improve default los colors
- OverheadCamera: make angle 100% stable when doing `mousewheel down then up`
! remove los view w/o radar a.k.a. [;] (can be emulated with Spring.SetLosViewColors)
- draw weapon debug spheres in /debugcolvol (aimfrom pos, muzzle pos, target pos)
- fix harvesting
- fix #4591: builders `randomly` remove build orders from queue
- fix #4587: (stuck units in labs): remove a failing optimization CPathEstimator::FindOffset()
- fix units disobey move cmds
- fix user target being set for all weapons
- fix aircraft in groups (e.g. brawlers) not being able to attack the target and landing instead at target pos
! fixed shaking units when getting close to blocked squares
- repath GroundMoveType only every SlowUpdate() (to save cpu cycles)
- runtime cache failed paths, too (and use a lower lifeTime for them)
- fix #4592: broken per-piece coldet
- fix #4602 and improve CQuadField::GetUnitsAndFeaturesColVol
- speed up UnitCollisions
- base automatic attack commands for idle units on weapon priorities
- refactor weapon code:
- use LeadTargetPos more often
- give current unit's target higher priority than weapon ones
- plasmarepulsor: spawn projectiles from QueryWeapon (when defined)
- drop bombs from QueryWeapon() (when defined) and not AimFromWeapon()
- call AimWeapon() more often (depending on fireTolerance tag)
- see fireTolerance & allowNonBlockingAim tags
- fix impactOnly BeamLasers or LightninghtCannons dealing damage to units in the path of a beam blocked by water or a shield. (by GoogleFrog)
- add fallback name:
- weaponVelocity := maxVelocity
- weaponAcceleration := acceleration
- add fireTolerance tag: Angle which prevents a weapon from firing in CanFire. (GoogleFrog)
- add allowNonBlockingAim tag (default false = old behaviour). When enabled it makes AimWeapon() LUS/COB calls non-blocking (still the fireTolerance tag might prevent the weapon firing).
This is very useful for fast units that need to retarget often (e.g. armflash driving next to a llt).
- add new tag attackSafetyDistance used by airplanes (by springraaar)
- randomize IDs
- add SFX.RECURSIVE flag to Explode(), allowing to draw the piece and all its children recursively.
New InfoTexture Renderer:
- new shader based InfoTexture (faster, shinier & modular)
- add new `/ToggleInfo %name_or_shader_path%`
- fix #4608: add new /showpathtype [movdefname | movedefid | unitdefname | -1]
- removed multiple linked lists from rendering (massive speed up, cutting rendertime upto 2-3 times!)
! fix particle limit being ignored for particles created in the same GameFrame
- ShieldParticles: reduce count of particles by more than half
- always draw WaterPlane (that's not the water surface) below current minimum terrain height
- FlyingPieces: add camera frustum check
! SMFTexAniso: changed default to 4 (was 0)
- add UseShaderCache config tag (default true)
- allow to override the following InfoMaps via mapinfo.lua: (by enetheru)
- metalmapTex
- typemapTex
- grassmapTex
- minimapTex
- allow to load dds as detailtex
- add Spring.Reload(script) to change/map & game without exiting spring
! modified Spring.Restart(parameters, script): it only restarts spring when parameters isn't empty
! removed alias "/quit" (use /quitforce)
- add "quit to menu" to quit-box
- add "/reloadforce"
- add callouts to read and set engagement range of a unit (by FLOZi)
- Spring.GetUnitMaxRange(unitID) -> number maxRange
- Spring.SetUnitMaxRange(unitID, maxRange) -> nil
- add Spring.GetLosViewColors
- add new call-in: UnitStunned(unitID, unitDefID, unitTeam, stunned) -- called whenever a unit changes its stun status
- add Set/GetProjectileIsIntercepted
- add GetProjectileTimeToLive, GetProjectileOwnerID and GetProjectileTeamID.
- add a second return value to AllowWeaponTargetCheck callin to allow ignoring the callin.
! remove Spring.UpdateInfoTexture
! fix Spring.GetKeyState & Spring.PressedKeys expecting SDL2 keycodes while whole lua gets SDL1 ones
! Spring.PressedKeys now also returns keynames
- fix missing COLVOL_TYPE_SPHERE in luadefs
- add new tag `grayscale16bit` to gl.SaveImage() to save single color 16bit PNG
- add Spring.SetUnitTarget(unitid, nil) syntax
- expose some tags to LuaDefs: (by sprunk)
- expose maxReverseSpeed to LuaUnitDefs
- expose dynDamage tags to LuaWeaponDefs
- expose flightTime tag to LuaWeaponDefs
- support rapid tags
- allow to disable demo file recording in script.txt via RecordDemo = 0
- add DefaultStartScript config setting:
- if set, automaticly start it!
- add --oldmenu command line parameter to always get to the old menu
AI: (all by rlcevg)
- add Lua.callRules, Lua.callUI to JavaOO
- added weapon related callouts: Unit_getWeapons, Unit_getWeapon, Unit_Weapon_getDef, Unit_Weapon_getReloadTime
- expose resources via Game_getTeamResource* & Economy_get*
- new linux crashhandler (by Major Bor3d0m)
- HWCursor: support for 48x48 & 96x96 sizes
- allow to enable isolated mode by creating a file isolated.txt next to spring executable
! merged spring-headless / spring-dedicated into linux static builds / windows installer
! remove broken maven support
- colorize gcc output
! remove DEBUG2 & DEBUG3, replaced with just DEBUG
- enable "Identical Code Folding" with
- disable unused ASSIMP formats at compiletime
- add cmake option DEBUG_LUANAN to enable lua check for nans in a release build
-- 98.0 ---------------------------------------------------------
- vaporized PathFinder's runtime precache cpu usage
Cmdline Arguments:
- allow ./spring --game rapid://ba:stable --map DeltaSiegeDry
- give correct error message when cmdline given filepath wasn't quoted and contained spaces
- rename BypassScriptPasswordCheck to AllowSpectatorJoin and default to true
- added AssignPlayerToTeam(playerID, teamID)
- added SetAlly(firstAllyTeamId, secondAllyTeamId, ally)
- added VFS.UnmapArchive(string fileName)
- added VFS.GetMaps(), VFS.GetGames(), VFS.GetAllArchives(), VFS.HasArchive(archiveName)
- added VFS.GetArchiveInfo(archiveName)
- added VFS.GetArchiveChecksum(archiveName)
- added VFS.GetArchiveDependencies(archiveName), VFS.GetArchiveReplaces(archiveName)
- allow tcp connections by luasocket as default (udp is still restricted)
- add callin DrawInMiniMapBackground(sizex, sizey) -> nil
- add callin AllowBuilderHoldFire(unitID, unitDefID, action) --> boolean
action is one of:
Build -1
Repair 40 (CMD_REPAIR)
Reclaim 90 (CMD_RECLAIM)
Restore 110 (CMD_RESTORE)
Resurrect 125 (CMD_RESURRECT)
Capture 130 (CMD_CAPTURE)
- glFont: make inlined colorcodes reuse current set alpha value
- make lowRes PathEstimator using medRes PE instead of maxRes PathFinder (massively reducing cputime)
- massive cleanup & modularization
- reduced memory usage
- modrules: add system.pathFinderUpdateRate tag
- fixed/reduced PathEstimator update rate
- crashing aircraft doesn't spam PE updates anymore (#4500)
! fixed booleans in CEGs (sometimes they were randomly overriden with random data)
- shields have a new weapondef tag armorType - specifies the armor category to which the shield belongs (you can input either an armorclass name, or a unitdef name to share that unit's armor category)
! move magic number to weapondef_post.lua: crater were 1.5x of craterAreaOfEffect while decals are 1.0x -> make them _both same size_
! fixed #4523: typo in craterAoE loading
! LightningCannon visual now obeys the beamTTL weapondef tag (behaviour same as BeamLaser) - previous value was hardcoded 10
! wobble and sprayAngle now improve with experience (same as [moving]accuracy)
! Shields obey dynamic damage
- GroundBlocking: don't align immobile objects to even squares
- reduce load in Collisions handling (by doing blocked ground squares scans only every 2nd frame)
- AI is initializated earlier: no more hang on game start
- add /set GrassDetail to console
- slightly speed up scanning for archives
- add HostIPDefault, HostPortDefault to set default host ip/port
- reduce default spintime of ThreadPool workers to 1ms (from 5ms)
! remove LogFlush, introduce LogFlushLevel:
when a log-message with level >= LogFlushLevel is logged,
logfile is flushed, else not,
see rts/System/Log/Level.h for int values
! rename /nosound to /mutesound
- fix #4417 (spring spring://username:passwd@hostname:port doesn't work)
- fix #4413 (widget:GameProgress() was no longer called for rejoining player)
- fix #4407 (SetUnitRotation broken for buildings)
- fix #4406 (crash at start)
- fix #4377 (compile with cmake 3.0)
- fix #3677 (bounceExplosionGenerator tag does not work for bouncing aircraftbomb weapon types)
- fix #4483 (Spring.SetProjectileAlwaysVisible doesn't always make a projectile always visible)
- KingRaptor found the cause of a _very_ old bug: fix green screen tint in startselector stage
- PE: fix bug where buildings weren't registered as blocking, cause they were not snapped to ground when the PE update was called (c03022cc)
- fixed return-type and value of Pathing::GetApproximateLength (pullrequest by rlcevg)
- heavily reduced files which are compiled multiple times
! add check for gcc >=4.7 at configure
-- 97.0 ---------------------------------------------------------
- utf8 support (kudos go to N0U)
- switch from sdl to sdl2:
- added /fullscreen (alt+enter) command ingame
- fixes some window manager bugs/problems
- KeyChains (kudos go to MajBoredom)
- split LuaRules & LuaGaia into their synced/unsynced luaStates
Cmdline Arguments:
- added new `spring spring://username:passwd@hostname:port` syntax (all except hostname are optional, i.e. spring://localhost does work fine)
- Should in longterm replace script.txt for clients, so script.txt is only needed for hosts.
-> No need to create a file on the filesystem to start spring as a client.
- Spring links spring:// URL scheme in the OS, so you can start such URLs from browser (as UT99 did).
E.g. you can place a spectator link on your website to join your autohosts and/or you can use it for weblobbies.
! changed -s/--server argument to take a param (the ip/hostname listen to)
! removed -c/--client argument (was only needed in times when clients didn't retrieved their script.txt from the server)
Hosting & Connecting:
- fixed direct connect in SelectMenu
- by default listen to localhost:8452 now, so you can always connect to localhost started matches
- improve debug draw (alt+[b])
! demofile string in infolog changed "recording demo: %s" -> "Recording demo to: %s"
- demo filehandle is now opened on start, so you can use lsof to readback the used filename
- fix freetype not found on windows / mingw
! add check for gcc >=4.6 at configure
- optional fontconfig support
! SDL2 dependency
- `DebugGL` configtag works now (cause of SDL2 switch)
! removed /keyset
! removed /hotbind (Ctrl+insert)
- new KeyChains support:
- example: /bind Ctrl+a,Ctrl+b say Hello World!
- you can double bind a button this way, e.g.:
- "/bind e,e say Bar", "/bind e say Foo" -> 1st press prints Foo, 2nd press prints Bar
- use KeyChains for defaults:
! double hitting drawbutton sets label
! switching between ally,spec & all chat is now done by double hitting alt,shift or ctrl
! alt+return now toggles fullscreen (default shortcut e.g. in mediaplayers)
- the parser now checks the returned tables for NaNs & Infs and prints a warning if it finds some (they are sources of desyncs!)
- add new "harvestStorage" unitdef tag, UnitHarvestStorageFull lua callin and Spring.GetUnitHarvestStorage(unitid) callout
it's for engine assisted starcraft/c&c like feature harvesting (atm only metal is supported)
NOTE: the unload command still needs to be implemented in lua (much less work than the reclaiming one)
- LuaRules & LuaGaia are now splitted into their synced & unsynced parts, and each one got its own luaState
! this way unsynced parts of gadgets now get `synced` callins like 'UnitCreated' etc. w/o SendToUnsynced from their synced part
- LuaRules & LuaGaia are now ~equal (except a very minor subset of differences) and get the same callins esp. all AllowXYZ callins
- LuaUI now has a GotChatMsg too (same as LuaRules always had), it's similar to the now deprecated LuaUI-only ConfigCommand callin, but is called more often
- fixed a lot bugs in Spring's c-lua code
- use lua's original math.random() code and only use streflop for it in synced luaStates
- always make math.randomseed() available (synced & unsynced)
- in future this will also allow multithreading of the different luaStates
! SYNCED. does a copy on access now and so is slow:
- bad: for i=1,100 do ...[i] ... end
- good: local foo =; for i=1,100 do ... foo[i] ... end
! SYNCED. can't be localized in global scope anymore:
- bad: local foo =; function gadget:DrawWorld() ... foo ... end
- good: function gadget:DrawWorld() local foo =; ... foo ... end
! moved Spring.GetGameSpeed() from SyncedRead to UnsyncedRead cause it was causing desyncs in demos
- fix Spring.Restart on windows
! new TextInput(utf8char) callin, needed cause of changed unicode handling in SDL2
- added Spring.SetUnitHarvestStorage(unitid, metal) & Spring.GetUnitHarvestStorage(unitid)
! prevent triggering of ATi driver bugs
! gl.LineWidth & gl.PointSize throw an error when called with incorrect argument (<=0)
! gl.Scissor & gl.CreateTexture throw an error on incorrect sizes, too
! fix gl.Viewport
- add missing colvol tags to Unit-/FeatureDefs:
- .collisionVolume.type = {"ellipsoid" | "cylinder" | "box"}
- .collisionVolume.scale{X|Y|Z}
- .collisionVolume.offset{X|Y|Z}
- .collisionVolume.boundingRadius
- .collisionVolume.defaultToSphere
- .collisionVolume.defaultToFootPrint
- .collisionVolume.defaultToPieceTree
- add optional 4th argument to Spring.GetUnitSeperation to calc the distance between the unitsphere surfaces instead of their midpos
! fix wrong coords & crash in Spring.RemoveGrass
- added new LOG.NOTICE (should be used instead of LOG.INFO)
- improve Spring.GetKeyBindings output (backward compatible)
- added Script.IsEngineMinVersion(major [,minor [,commits]])
- added Spring.GetClipboard() & Spring.SetClipboard(string text)
- allow to connect to by luasocket as default
- SetUnitValue now accepts booleans, too
- fixed desync checker
- added GAME/MUTATOR{0..9} so you can load arbitrary mutator archives before the game
- make GameID the only seed of the synced random generator
so you can define the gameid in a luaAI battle startscript and you will always get a syncing match
! disallow to install spring over existing installations / ask for uninstall first
- don't associate .sdf with spring.exe any more
! new BlockCompositing configtag (default true). Disables kwin compositing to fix tearing.
-- 96.0 ---------------------------------------------------------
- kill memory leaks crippling large games (#4152)
- kill micro-jitter in simulation framerate (#4171)
- kill unclean exits causing various forms of corruption (#4053)
- "nugget" is hereby officially promoted as the new umbrella term for widget or gadget
- default disable grass for ATI cards (crashes for some people)
- made stacktrace-translation script recognize more crash/hang patterns
- improve Shard AI for BA
- fix some MSVC compile errors
- TimeProfiler (alt+b) shows now max `lag` of each item
- massively speedup caching with many .sdd archives
- fixed some FreeBSD compile issues (thx AMDmi3)
- dump (engine) shaders to infolog when they fail to compile
- more extensive logging during shutdown
- fix a number of potential issues if a thread crashes on engine shutdown
- increase precision of several timer variables to preserve intermediate results
- Lua: track more memory-allocater statistics for display in debug-mode
- Lua: limit maximum amount of memory allocated globally and per handle
- GameServer: always echo back client sync-responses every 60 frames (see #4140)
- GameServer: removed code that blocks pause / speed change commands from players with high CPU-use in median speedctrl policy
- GameServer: sleep less between updates so it does not risk falling behind client message consumption rate
- LuaHandle: make time and steps spent on garbage collection configurable
CollectGarbage callin is restricted to run for at most
MaxLuaGarbageCollectionTime (user-configurable) millisecs
MaxLuaGarbageCollectionSteps (user-configurable) iterations
- GlobalConfig: add new config-option 'UseNetMessageSmoothingBuffer' (see #4053)
- LogOutput: make enabled 'section' log-levels configurable by users
- MoveDef: add key 'allowTerrainCollisions' for handling units with super-sized footprints (see #4217)
- SolidObject: make {Unit,Feature}{Pre}Damaged events receive the 'attacker' ID when object is crushed
- QuadField: add raytraced projectiles to three cells instead of one
- GameInfo: add map hardness label/value to 'i' overlay
- Rifle weapons can hit features too now and apply impulse to the target
- add gadgetHandler:AllowWeaponInterceptTarget
- LuaSyncedRead:
make Get{Unit,Factory}Commands (optionally) return just the queue's size
(ie. without copying the entire command queue into Lua VM memory, *VERY*
important for performance when a nugget is not interested in the commands
"if #Spring.GetCommandQueue(unitID, -1 | nil ) == 0 then return end" --> BAD, CREATES COPY OF QUEUE
"if Spring.GetCommandQueue(unitID, -1 | nil, false) == 0 then return end" --> GOOD, DO THIS IF POSSIBLE
- fix #4215 (stack-buildable units on non-flat terrain)
- fix #4209 (antinukes firing at nukes targeted outside their area)
- fix #4205 (air-transports unable to unload hovercraft on water)
- fix #4204 (float3.* clang compilation failure)
- fix #4203 (air-transport unable to load units floating on water)
- fix #4202 (S3O textures loaded multiple times instead of being cached)
- fix #4200 (secret)
- fix #4198 (amphibious units without waterweapons chasing hovercraft whilst underwater)
- fix #4197 (units moving right up to their target instead of attacking from range)
- fix #4186 (log-system crash on exit)
- fix #4173 ("Error: [Watchdog::ClearTimer] Invalid thread N")
- fix #4171 (see 'Major' section)
- fix #4163 (corrupted unit environment reflections)
- fix #4161 (Spring.Restart failing when path contains spaces)
- fix #4155 (reverse-built gunships maintain their vertical speed)
- fix #4154 (calling LUS 'AttachUnit(piece, unitID)' turns following 'Move(piece, ...)' calls into no-ops)
- fix #4152 (see 'Major' section)
- fix #4149 (rendering corruption in DynamicWater mode)
- fix #4144 (partly submerged units not hittable by non-waterweapons)
- fix #4145 (depthcharges fired by ships having trouble to reach their targets)
- fix #4138 (same as #4171)
- fix #4137 (units randomly switching team-color, old bug with new cause)
- fix #4135 (ATI driver crash with *disabled* shadows)
- fix #4133 (cloaked units hidden even when set to alwaysVisible)
- fix #4131 (units moving to position of manualfire command if outside weapon range)
- fix #4129 (air-constructors flailing around construction targets)
- fix #4128 (units stuck in 'skidding' state: repeatedly bouncing on ground while unable to move)
- fix #4091 (gadget:MousePress() and other unsynced gadget functions not called with LoadingMT=0)
- fix #4053 (see 'Major' section)
- fix #3749 ('initCloaked' UnitDef tag overriding user cloak commands for being-built units)
- fixed wreckage heaps could be resurrected
- LaserCannon: (once again) fix range overshooting
- always clamp length of blended wind-vector to [map.minwind, map.maxwind]
- the 'AllowDeferred*Rendering' config options are now safe to enable
-- 95.0 ---------------------------------------------------------
! new datadir structure: &
! new LuaIntro (Lua based loadscreen with examples)
- add map border rendering (+ /mapborder command)
- bugfixes & speedups
! remove support for SM3 maps
(but fix #3942 so SM3 is left in a slightly less broken state for whoever wants to mess with it in the future)
- use SSE in some matrix math
- save a little mem in Pathfinder
- reduce PFS update rate by 10%
- little speedup in Grass rendering (it's still slow on some maps)
- use 32bit shadowmap. ~7% faster than 24bit one, cause of better alignment
- move Lua GC to its own callin; fixes bug where GC was too slow to catch up and ate >>100MB ram
- nihiliate MiniMap usage by rendering it to a texture
- PathEstimator: add unsynced caches (*might* help in big AI games)
- ExplosionGenerator:
pre-load all static (weapon/model/piece) CEG's and
never do lazy script-parsing anymore where possible
(only CEG's delay-spawned by other CEG's are still
loaded this way, rest can be dynamically reloaded)
- PFS: prevent special-case search expansion when unit is close to goal but goal is blocked
- make FeatureHandler::AllocateNewFeatureIDs more efficient in case of feature spam
- force-align all thread entry points so SSE functions don't crash (on win32)
- allow Lua AI's to be selected from the menu
! removed "mods" from archive scandirs
! converted RotateLogFiles to a bool var (defaults to false)
! remove "--projectiledump" and add "--list-ceg-classes" (converted to JSON format )
- do not switch camera-mode on countdown
- colorized stdout (you can use `spring --nocolor` & SPRING_NOCOLOR envvar to disable)
- show LuaMemUsage in /debug view
! load only image formats which work on all platforms, current supported image formats are:
! remove engine support for gamedata/messages.tdf,
see examples/Widgets/game_messages.lua for a possible replacement
- more verbose CEG parsing (warns now about unknown tags)
- switch to a high precision clock all over the engine (including Lua)
- copied a lot config descriptions from wiki to the engine (thx for all the wiki'ers)
- is now automatically updated with each release
! disable build of spring-multithreaded (unmaintained / doesn't compile)
! disable luaThreadingModel > 2, can be overriden with EnableUnsafeAndBrokenMT=1
fixes #3774, #2884, #2784, #3673, #3808
- more verbosity for spring-dedicated on exit & demo-writing
- add config "MenuArchive" to allow background image to be set which is read from the archive in the path bitmaps/ui/background/
- fix /keydebug for release builds
- updated game_end example gadget to handle quit/resigns better, reacts faster, and better code
- GuiTraceRay does not stop at water surface anymore by default
(all ground-attack positions are adjusted in synced code now)
--> torpedo launchers cannot overshoot, etc.
- GuiTraceRay now ignores noSelect units
- SmoothCameraController: add SMOOTHing to alt+mousewheel zoom
- change WorldObject::speed to a float4, store magnitude in .w
(saves a number of unnecessary .Length() calls here and there)
- PathCache: track maximum size + double initial capacity, register hash collisions and switch hash function
- GameServer: add config-option ServerRecordDemos
non-dedicated servers (eg. headless builds used as "dedicated" standin) can now record games if desired
ACHTUNG: server demos are now stored in a separate directory "demos-server/" to prevent name conflicts!
- AssParser:
generalize logic for multiple UV channels
fix major issue with baked transforms
restrict support to well-known & -maintained formats (.3DS, .DAE, .LWO, .BLEND)
allow modellers to work around #3552 by recognizing a number of new piece-table keys
for the root piece:
"xaxis" = float3, "yaxis" = float3, "zaxis" = float3 (determine global orientation of model)
for all pieces:
"rotAxisSigns" = float3 (determines direction of script-applied rotations around each axis)
"rotAxisMap" = number (currently can only be 0=XYZ or 3=XZY, determines coordinate conversion)
- SpringApp:
fix old bug in fullscreen&&dualscreen mode cutting window-size in half on each SDL_VIDEOEXPOSE event
refactor to allow choice of (win32) timer via cmdline&config
- SpringTime:
switch to native win32 clock (same as used by SDL) on windows
select win32 clock based on config&cmdline-parameter 'useHighResTimer'
remove the last SDL_GetTicks dependencies
- reduce target-lost CAI timeout from 8 to 2 seconds
- make calls to script->{Start, Stop}Moving more consistent: only run them
when a unit transitions from zero to non-zero speed or vice versa, and no
longer do so during in-place rotations --> animations should no longer be
interrupted / reset
! remove TA-specific code in CobInstance::Create
(this changes the argument value to COB's SetMaxReloadTime for
units equipped with BeamLasers and / or more than one weapon)
- {Laser, Emg}Projectile: disable all collision-testing when ttl <= 0
these projectile types could exceed their range due to fadeout
and only removed themselves (deleteMe=true) when intensity or
length reached 0, so without disabling coldet (checkCol=false)
range-exploits were possible
- remove impulse "capacitance" from ground units (SolidObject::residualImpulse and ::StoreImpulse())
- apply UnitDef::myGravity to ground units (if non-zero)
NOTE: myGravity acts as a map-gravity MULTIPLIER for aircraft; it REPLACES map gravity for land-based units
- steering/avoidance: actively avoid only mobile units, let PFS/CD handle statics
- SolidObject:
cleanup internal physical/collision state management
model physical drag, use it for features and skidding units
related to the change above: Spring.Set*Physics now takes three extra number
arguments (Set*Physics(..., number drag.x, number drag.y, number drag.z))
to control how much an object is affected by drag forces
- Feature: set default impulseMult to 0 for 'immobile' / static wreckage (cf. new FeaturePreDamaged)
- Unit: transfer impulse to transporter if being transported
- Unit: swap order of UnitPreDamaged and HitByWeapon callins (viewtopic.php?f=23&t=30879)
- *Weapon: fix minor targeting issues due to new SolidObject underwater state definition
- LaserCannon: calculate projectile ttl from weapon range, not weapondef range
- BombDropper:
*always* drop bombs/torpedoes in time to hit target
(even if the distance from weapon to target still exceeds static
range, range is not meaningful for these weapons anyway since it
depends on launching unit's velocity, altitude and gravity)
- BeamLaser: fully reimplement the sweepfire logic
still has no script interaction so use with care
(respects reloadtime constraint but not much else)
! UnitDef:
read brakeRate for aircraft without scaling by 0.1 and make brakeRate
default to maxAcc, not maxAcc * 3.0 (--> open up your unitdef_post's)
- WeaponDef: silently ignore bad slavedTo indices
- MoveDef:
remove old naming-scheme restrictions (which required names to contain "tank", etc)
instead parse key "speedModClass" with accepted values 0=Tank, 1=KBot, 2=Hover, 3=Ship
fix insane default value for heatMod parameter (since 7bef7760f4)
- MoveType: fix LOS emit-heights for floating units being relative to ocean floor
- AAirMoveType: do not use fuel while being refueled (yo dawg...)
- StrafeAirMoveType: overshoot less when landing
- HoverAirMoveType:
remove support for reading (and assigning to) key "brakeDistance"
via MoveCtrl; this quantity is now calculated dynamically based
on speed
- GroundMoveType:
add missing TestMoveSquare checks in places where units are repositioned by coldet
fix minor bug in GetGroundHeight (caused hovercraft to vibrate in shallow water)
- remove ancient "move transportee 1000 elmos under the map to hide it when attaching to piece -1" hack
there is now a "void" state for such purposes; objects (units and features) in this state will never
1) take damage, even from Lua (but can be killed by Lua)
2) be rendered through any engine path (nor their icons)
3) be intersectable by either synced or unsynced rays
4) block any other objects from existing on top of them
5) be selectable
- hovercraft now take water damage by default
! LuaUnitDefs: deprecate the "drag" key, was an internal variable
- LuaUnitDefs:
add more is* functions for all unit-types known to Spring
the complete function list as of 95.0 is:
fully deprecate the following UnitDef keys:
after 95.0 these will all become nil, beware
! LuaUnitDefs: deprecate canHover (check instead to determine if a unit is a hovercraft)
- LuaUnitDefs: log error when explodeAs & selfDestructAs are missing
- LuaUnitScript: optionally make Turn and Move insta-update piece matrices (pass "true" as the fifth argument)
- LuaRules:
setup "proper" (transformation) state for the DrawProjectile callin
add callin AllowWeaponInterceptTarget(number interceptorUnitID, number interceptorWeaponID, number targetProjectileID) --> boolean
add callins FeatureDamaged and FeaturePreDamaged
number featureID, number featureDefID, number featureTeam,
number damage
[, number weaponDefID, number projectileID
[, number attackerID, number attackerDefID, number attackerTeam ]]
number featureID, number featureDefID, number featureTeam,
number damage
[, number weaponDefID, number projectileID
[, number attackerID, number attackerDefID, number attackerTeam ]]
! LuaSynced*: make sure ALL weapon API functions are 1-based
! LuaSynced*: make {S,G}et{Unit,Feature}Blocking signatures match
Get{Unit,Feature}Blocking(number objectID) -->
boolean isBlocking,
boolean isSolidObjectCollidable,
boolean isProjectileCollidable,
boolean isRaySegmentCollidable,
boolean crushable,
boolean blockEnemyPushing,
boolean blockHeightChanges
number objectID,
boolean isBlocking,
boolean isSolidObjectCollidable
[, boolean isProjectileCollidable
[, boolean isRaySegmentCollidable
[, boolean crushable
[, boolean blockEnemyPushing
[, boolean blockHeightChanges ]]]]]
! LuaSynced*: slightly change {Get,Set}ProjectileTarget signatures
GetProjectileTarget now returns a number instead of a string to indicate target-type
GetProjectileTarget now always returns two arguments (if given projectileID is valid)
GetProjectileTarget now always returns a target position if projectile has no target object
SetProjectileTarget now takes a number instead of a string to indicate target-type
GetProjectileTarget(number projectileID) --> nil | [number targetType, number targetID | table targetPos = {[1] = x, ...}]
SetProjectileTarget(number projectileID, [number targetID [, number targetType]] | [number x, number y, number z]) --> nil | boolean
where targetType is one of {string.byte('g') = GROUND, string.byte('u') = UNIT, string.byte('f') = FEATURE, string.byte('p') = PROJECTILE}
- LuaSynced*:
add callout Spring.GetRadarErrorParams(number allyTeamID) --> nil | number allyteamErrorSize, number baseErrorSize, number baseErrorMult
add callout Spring.SetRadarErrorParams(number allyTeamID, number allyteamErrorSize [, number baseErrorSize [, number baseErrorMult ]]) --> nil
add callout Spring.SetUnitPosErrorParams(number unitID,
number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,
number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z
[ , number nextPosErrorUpdate]) --> nil
add callout Spring.GetUnitPosErrorParams(number unitID) --> nil |
number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,
number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,
number nextPosErrorUpdate
add callout Spring.SetFeatureBlocking(args = see SetUnitBlocking) --> boolean
add callout Spring.SetPieceProjectileParams(number projectileID,
[ number explosionFlags, [ number spinAngle, [ number spinSpeed,
[ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --> nil
deprecate the Spring.SetProjectileSpin* functions
add callout Spring.GetFeatureBlocking(number featureID) --> boolean collidable, boolean crushable, boolean blocking
add third return-value to Spring.GetUnitBlocking (signature is the same as that of GetFeatureBlocking)
- LuaSyncedCtrl:
add callout SetProjectileAlwaysVisible(number projectileID, boolean alwaysVisible) --> nil
add callouts SetFeatureVelocity and SetFeaturePhysics (these work like their SetUnit* counterparts, reference the wiki docs)
cleanup arg-parsing of Spring.SetUnitPieceCollisionVolumeData callout
new signature: SetUnitPieceCollisionVolumeData(
number unitID,
number pieceIdx,
boolean enable,
number scales.x, number scales.y, number scales.z,
number offset.x, number offset.y, number offset.z
[, number volumeType [, number primaryAxis]]
! LuaSyncedRead: deprecate the Spring.GetProjectileSpin* functions
- LuaSyncedRead:
add Spring.GetPieceProjectileParams(number projectileID) -->
number explosionFlags, number spinAngle, number spinSpeed,
number spinVector.x, number spinVector.y, number spinVector.z
add callout Spring.GetUnitWeaponCanFire(number unitID, number weaponNum) --> boolean
add callout Spring.GetFeatureVelocity(number featureID[, boolean norm]) --> nil | number vel.x, number vel.y, number vel.z[, number |vel|] and Spring.GetProjectileDirection(number projectileID) --> nil | number dir.x, number dir.y, number dir.z
add callout Spring.GetProjectileDefID(number projectileID) --> nil | number weaponDefID
using this to get a weaponDefID is HIGHLY preferred to indexing WeaponDefNames via GetProjectileName
add callout Spring.GetUnitRotation(number unitID) --> nil | number pitch, number yaw, number roll (WIP)
extend arguments to Spring.TestMoveOrder
old signature: TestMoveOrder(
number unitDefID,
number pos.x, number pos.y, number pos.z
) --> boolean
new signature: TestMoveOrder(
number unitDefID,
number pos.x, number pos.y, number pos.z
[, number dir.x
[, number dir.y
[, number dir.z
[, boolean testTerrain
[, boolean testObjects
[, boolean centerOnly ]]]]]]
) --> boolean
added GetUnitWeaponTarget(unitID, weaponID) ->
nil | number targetType [, bool isUserTarget, table targetPos = {x, y, z} | number targetID]
(returned number of args is always 3 if targetType != None)
- LuaUnsyncedRead:
add callout Spring.GetPixelDir(int x, int y) -> number dirx, number diry, number dirz
add callout Spring.GetVisibleProjectiles(
[ number allyTeamID = -1
[ , boolean addSyncedProjectiles = true
[ , boolean addWeaponProjectiles = true
[ , boolean addPieceProjectiles = true ]]]]
) --> nil | {[1] = projectileID, ...}
! Spring.GetUnitNearestEnemy doesn't return neutral units anymore
- Spring.GetProjectileVelocity now returns (targetPos - startPos) for BeamLasers and other hitscan weapons
- Spring.Get{}Velocity: always return speed.w (it's free now)
- Spring.SpawnCEG: allow number (cegID) as first arg + return a second value (number cegID)
- add Spring.GetLogSections() & Spring.SetLogSectionFilterLevel(string sectionName, string|number logLevel)
- add new Game. constants: Game.gameName, Game.gameVersion, ...
- allow to save strings in RulesParams
- add 'parent' field to Spring.GetUnitPieceInfo
- GadgetHandler:
add several missing callins (AllowStartPosition, ...)
expose actionHandler through gadgetHandler table (seems to be a common enough mod)
log if callin is not implemented
unify callin lists (now all in callins.lua)
add missing projectileID argument to UnitDamaged
- LuaOpenGL::Draw{List,Func}AtUnit: just use drawPos or drawMidPos
- gl: add callout UniformArray(number location, number type, table uniforms) -> nil
(type can be one of {0 = int, 1 = float})
- gl.CreateShader: support uniform arrays (table values with more than 4 and up to 32 elements)
- gl.CreateShader: make 'definitions' a recognized key (whose value should be a subtable or string of shader #define's)
- Spring.{Get,Diff}Timer(s): save some precision (important with new high-resolution timers)
- Spring.DiffTimers: accept optional third argument (boolean) to return dt in milliseconds
- add some utility functions to the math table, see
- LoadingMT: add a runtime check that should detect incompatibilities
- disable ARB shaders with Intel/Mesa drivers (can be overridden by setting ForceEnableIntelShaderSupport=1)
- reduce used varyings in SMF GLSL shader in the hope it will fix advmapshading on some lowend GPUs
- render MiniMap to a texture and update it async from screen (new configtags: MiniMapRenderToTexture & MiniMapRefreshRate)
- do not draw ground reflections in water if drawGround=false
- 3DModel: do not set tex1 to 'default.png' (it breaks assimp's auto-texturing ability)
- SMFFragProg: fix '#version must occur before any other statement' and eliminate dynamic branching
- implement Lua-bindable map and model normal/depth/material buffers
note: this is *FULLY* compatible with custom Lua UnitRendering
shaders (even easier if some minor framework changes are made)
so the vast majority of deferred rendering operations is now
within Lua's abilities
new configuration-keys to enable/disable G-buffer draw-passes:
AllowDeferredMapRendering (default true)
AllowDeferredModelRendering (default true)
new LuaUnsyncedCtrl callouts to enable/disable G-buffer updates:
Spring.SetDrawGroundDeferred(boolean) -> nil
Spring.SetDrawModelsDeferred(boolean) -> nil
new LuaUnitRendering Material keys:
"standard_shader" (same as "shader")
"deferred_shader" = {vertex = ..., ...}
"deferred" (same as "deferred_shader")
deferred fragment shaders must *ONLY* write to gl_FragData[i] where
i = {0 = normals, 1 = diffuse, 2 = specular, 3 = emissive, 4 = misc}
new Lua texture names:
"$map_gb_nt" or "$map_gbuffer_normtex"
"$map_gb_dt" or "$map_gbuffer_difftex"
"$map_gb_st" or "$map_gbuffer_spectex"
"$map_gb_et" or "$map_gbuffer_emittex" // for emissive materials (bloom would be the canonical use)
"$map_gb_mt" or "$map_gbuffer_misctex" // for arbitrary shader data
"$map_gb_zt" or "$map_gbuffer_zvaltex"
"$mdl_gb_nt" or "$model_gbuffer_normtex"
"$mdl_gb_dt" or "$model_gbuffer_difftex"
"$mdl_gb_st" or "$model_gbuffer_spectex"
"$mdl_gb_et" or "$model_gbuffer_emittex"
"$mdl_gb_mt" or "$model_gbuffer_misctex"
"$mdl_gb_zt" or "$model_gbuffer_zvaltex"
! updated gentoo overlay url to
- switch to mingw64 for the windows build
- remove some custom Find*.cmake files
- fix #3645 Can't build if source directory has white spaces
! removed VS project files / fix compile with Visual Studio 2012 Express for Windows Desktop:
use cmake -G "Visual Studio 11" to generate project files
dropped support for Visual Studio 8, 9 & 10
! compile Spring using c++11 standard
- fix clang compile errors + some bugs detected by clang
! slightly refactored build system, now every target can be disabled:
spring-dedicated, spring-headless, spring-legacy, spring-multithreaded
- more unittests (extended FileSystem, timers, unitsync, SSE Matrix Math, ...)
- fix some errors when running spring in-source (AI / Interfaces are still broken)
! remove unused libspringserver
! fix {Get,Set}UnitWeapon{Fire,HoldFire,TryTarget,TestTarget,TestRange,HaveFreeLineOfFire} WeaponID argument to use the same 1-starting indexes as rest of lua interface
- fix #4092 (empty pieces Explode()'d with PF_FIRE flag leave behind small stationary fire FX)
- fix #4079 (resurrecting could lead to multiple units created by one wreck)
- fix #4078 (float-->int conversion overflow)
- fix #4073 (fuel-level of unit is lowered upon completion)
- fix #4070 (units can skip attack orders in their queue)
- fix #4068 (the "wrong cursor for certain attack commands" part)
- fix #4057 (double BeamLaser visualisation)
- fix #4054 (homing missiles miss radar dots of flying units)
- fix #4047 (ground decals don't fade away)
- fix #4043 (constructors can build large units ontop of themselves & walk through 'gaps')
- fix #4023 (allow 'key'=value options-table format in Spring.GiveOrderTo*)
- fix #4019 (receiveTracks not working reliably)
- fix #4011 (GetTeamStartPosition cannot determine whether start position was placed by player)
- fix #4010 (disable /spectator before gamestart)
- fix #4007 (large-radius air transports failing to load transportees)
- fix #3980 (air transports set to 'Land' wander around while idling if loaded)
- fix #3979 (unhelpful error message)
- fix #3974 (out-of-fuel bombers set to 'Land' fly all over the map)
- fix #3973 (aircraft taking off in wrong direction on attack orders)
- fix #3961 (expect ArmorDef subtables in array-format, show warning if armordefs contains old-style subtable entries)
- fix #3959 ("flying" ground-units colliding with aircraft looks unrealistic)
- fix #3957 (Unit icons of underwater units are drawn at water level instead of actual depth)
- fix #3951
submissile was being checked in the base-class for all
weapons despite being a TorpedoLauncher-only property
- fix #3948 (broken voidwater shading)
- fix #3941 (CBitmapMuzzleFlame doesn't render when dir is <0 -1 0>)
- fix #3937 (transport unloading on top of non-blocking objects)
- fix #3924 (add callout Spring.UpdateInfoTexture(number texMode) --> boolean)
- fix #3890 (Unloaded units fly across the map)
- fix #3873 (lag while loading model-less features)
- fix #3862 (aircraft overshooting/flailing around repair pads, also #3834)
- fix #3861 (BeamLaser does not hit if it starts within hitvolume)
- fix #3855 (LosHandler bug that made provided full LOS on underwater units in radar coverage)
- fix #3835 (try to avoid clash between Weapon::AutoTarget and MobileCAI::AutoGenerateTarget)
- fix #3785 (Construction aircraft getting stuck)
- fix #3783 (add FailedCommand sound to default sounds.lua)
- fix #3765 (make Gaia the default feature team, not -1/0)
- fix #3754 (high decal-strength unit tracks drawn twice due to alpha-wraparound)
- fix #3752 (safeguard execution of SimFrame() against garbage keyframe messages)
- fix #3743 (partially: make non-hovering aircraft start turning to goal during takeoff)
- fix #3739 (apply impulse to aircraft)
- fix #3737
gadget:AllowStartPosition() now receives the raw
unclamped start position as three extra arguments
- fix #3736 (TextureAtlas crash)
- fix #3720 (unit pushed through impassable part of factory)
- fix #3718 (units moving in circles near obstacles)
- fix #3715: make all info-textures individually queryable by Lua (gl.Texture)
"$info" and "$extra" still map to the active info-texture as before
"$info_losmap" or "$extra_losmap" map to the L-view texture
"$info_mtlmap" or "$extra_mtlmap" map to the F4-view texture
"$info_hgtmap" or "$extra_hgtmap" map to the F1-view texture
"$info_blkmap" or "$extra_blkmap" map to the F2-view texture
textures contain no data until user switches to their respective modes
non-active textures are not updated in the background, so will go stale
- fix #3714 (minimap icons of enemy units visible after /spectator plus /specfullview 0)
- fix #3697
Spring.GetPositionLosState now returns a 4th argument which indicates
if a position is actively being radar- or sonar-jammed by any allyteam
- fix #3686 (free flying ground units follow terrain slope)
- fix #3683 (minimap textures not freed on exit)
- fix #3681 (make widgetHandler:LoadConfigData() more robust)
- fix #3675 wrong loglevel in unit_script.lua
- fix #3665
AllowStartPosition now receives the ready-state of
each player as an argument too, making its complete
signature as of 95.0:
number clampedPos.x, number clampedPos.y, number clampedPos.z,
number playerID,
number readyState,
number rawPickPos.x, number rawPickPos.y, number rawPickPos.z
where readyState can be one of:
PLAYER_RDYSTATE_UPDATED = 0 -- player picked a position
PLAYER_RDYSTATE_READIED = 1 -- player clicked ready
PLAYER_RDYSTATE_FORCED = 2 -- game was force-started (player did not click ready)
! the default 'failed to choose' start-position is now just (0,0,0), not (0,-500,0)
- fix #3662 (secret)
- fix #3660 (memory leak in Spring.GetVisibleFeatures)
- fix #3655 (UnitDef::canMove misinterpreted by factory CAI code)
- fix #3653 (clash between mutually push-resistant units moving to same spot)
- fix #3643 (get PFS and CD to agree regarding factories)
- fix #3641 (fix several issues with units using per-piece collision volumes)
- fix #3640 (Groundplates don't disappear when out of LOS)
- fix #3637 (desyncs due to not versioning cache-data, also #3692)
- fix #3633 (non-3DO projectile models not being rendered fully)
- fix #3623 (broken PPCV offsets for DAE models)
- fix #3617 (ship transports can't load units)
- fix #3614 (units stuck on narrow terrain passages)
- fix #3606 (TorpedoLauncher force-attack aims at water surface)
- fix #3598 ("vibrating" ground units due to gravity)
- fix #3373 (crash when exiting before countdown finished)
- fix #1368 (AllowBuildStep only called for building)
- fix ground units not moving in FPS mode
- fix (non-hovering) aircraft jittering at high altitude
- fix submarines being considered "underwater" even when pos.y + height > 0
- fix subtle bug in LegacyAtlasAlloc::Allocate exposed by Intel GMA
atlas could grow LARGER than its maximum size in x-dimension due to TEXMARGIN not being considered
3DO texture atlas has a maximum size of 2048 pixels but grew to 2050 pixels in at least one *A game
on Intel hardware with maxTextureSize=2048 this caused driver memory corruption --> random crashes
- fix units switching team-colors
- fix debug-vectors for ground units being drawn even when not cheating or not spectating
- fix LoadScreen exception being thrown just for failing to load a startpic
- fix crash in Spring.GetVisibleUnits on bad teamID value
- fix C stack overflow in Shard
- fix logLevel of WatchDog stacktraces
- fix decals were rendered twice
- fix spike CEGs
- fix units with PPCV's ignoring mouse-rays; run PPCV test before CV test
- fix possible bug in MoveCtrl.SetMoveDef
- don't automaticly set "MaxSounds"
- try to fix "[Sound] Error: CSoundSource::Play: Unknown Internal Error" on Mac
- removed unused AI_UnpauseAfterInit config setting
- add DeleteSpringConfigKey(const char* name)
-- 94.1 ---------------------------------------------------------
- bump path cache version
-- 94.0 ---------------------------------------------------------
- default LogFlush to true again
- fix crash at start related to Optimus
! remove Tobis rapid client (its broken)
- add multi engine type support
- recycle unit and feature ID's less quickly again, a la 91.0 and prior
although this was an unintentional change in 92.* / 93.*, it exposed
many bugs in widgets and gadgets which INCORRECTLY assumed ID's were
globally unique for all time --> check your code for more latent bugs
- automatic runtime recompression of groundtextures to ETC1 (future MESA drivers should support ETC)
- fix #3591 (UnitFromFactory(..., userOrders) always passes userOrders=false)
- fix #3561 (units getting stuck on edges of impassable areas --> pathing is no longer FUBAR)
- fix #3575 (QTPFS terrain deformation lagspikes)
- fix #3580 (decreased unit/feature ID randomness)
- fix #3557 (TorpedoLauncher weapon fires only when on land)
- fix #3564 (sun-flare visible when obscured by terrain)
- fix #3553 (sun-flare has harsh edge)
- fix #3562 (units are reluctant to fire in crowded situations after 'fix #3488')
- fix #3559 (avoidGround weapon tag is broken)
- fix #3563 (units rub against building edges and slow down to a crawl) and #3592 related to it
- fix #3567 (transported nanotowers periodically teleporting to ground)
- fix #3520 (kamikaze units always have bad attack cursor when giving manual attack command)
- fix #3531 (wrong textures assigned to assimp models)
- fix #3545 (AddUnitImpulse() causes unit to move in random direction)
- fix #3544 (units briefly invisible when transferred to another team)
- fix #3490 (ships cannot be transported by aircraft)
- fix #3596 (in debug-mode the firing-cone visualisation of weapons points up)
- fix 'fix #3506 (wrong calculation of goffset for assimp model pieces)'
- fix pseudo-static units (nanotowers, etc) no longer being transportable
- fix #3569 (texturing for OBJ and ASS projectile models)
- fix OBJ models being parsed by assimp
- fix SEGV on exit
- fix flashing team colors
- fix some trees drawn after being destroyed
- add Spring.UnitWeapon{Fire,HoldFire}(number unitID, number weaponID) --> nil
- add callouts Spring.GetUnitWeapon{TryTarget,TestTarget,TestRange,HaveFreeLineOfFire}(number attackerID, number weaponID, number attackeeID | [number targetPosX, number targetPosY, number targetPosZ]) --> boolean
- add Spring.SetProjectileTarget(number projectileID, [number objectID, string objectType] | [number x, number y, number z]) --> boolean
- add Spring.GetProjectileTarget(number projectileID) --> number targetID, string targetType
- add Spring.SpawnProjectile(number weaponDefID, table projectileParams) --> number projectileID | nil
- add MoveCtrl.SetMoveDef(number unitID, number moveDefID | string moveDefName) --> boolean
- add projectileID argument to UnitPreDamaged
OLD signature: unitID, unitDefID, unitTeam, damage, paralyzer [, weaponDefID [, attackerID, attackerDefID, attackerTeam] ]
NEW signature: unitID, unitDefID, unitTeam, damage, paralyzer [, weaponDefID, projectileID [, attackerID, attackerDefID, attackerTeam] ]
-- 93.2 ---------------------------------------------------------
- fixed unitsync in linux static builds
-- 93.1 ---------------------------------------------------------
- fixed treedrawer crash
- fixed MT crashes
- fixed X11 cursor offset
- fixed smooth camera transitions
- fixed clipped sun
- fixed selection sounds
- fixed attack cursor for kamikaze units
- fixed wrong assimp texture
-- 93.0 ---------------------------------------------------------
- fixed disappearing GUI with non-GLSL drivers & grass rendering (3dtrees=1)
- fixed not working assimp textures
- fixed /ally
- fixed /chat[|ally|spec|all], so it doesn't misbehave when called from lua
- fixed attack-ground orders placed on water
- fix bug in footprint overlap detection reported by dnw
- make dead/crashing/stunned units unshareable (may fix #3476)
- fixed objects with cylindrical CVs would not take damage if hit in rear endcap
- block Lua from creating non-uniformly scaled COLVOL_TYPE_SPHERE volumes
- make sure pastetext and buffertext don't strip whitespaces from the attached message
- allow whisper between spec <-> spec (player -> spec and spec -> player whispers are still forbidden)
- fixed flying transport reservation not flushed properly with area commands (#3478)
- fix #3481 (unit targets not flushed on cloak + jam)
- fix #3488 (avoidFriendly check works improperly if firepoint is inside friendly unit)
- fix bug in ray-ground intersection logic
- make mutual push-resistant unit collisions more like 0.82.x (smoth's issue)
- fix some cases of units getting perma-stuck (s.t. even spammed user orders cannot free them) on terrain, esp. #3423
- fix #3506 (wrong calculation of goffset for assimp model pieces)
- fix #3505 (ground-transported units cannot be killed)
- fix #3465 (WeaponDef infolog error messages are unhelpful)
- fix attack-ground orders placed on water
GuiTraceRay now stops at water surface by default, not ocean floor
add sixth argument 'ignoreWater' to LuaUnsyncedRead::TraceScreenRay
- support double-resolution yardmaps for buildings (these require four times as many characters, beware)
the engine will interpret a yardmap string as such if its FIRST (and ONLY its first) character is 'h'
- workaround CVE-2013-0249 (disable all protocols expect http/https)
- reduce log messages
- fix invalid timeout
- fix ignored depends in http-downloads
! apply rotations & scalings
- fixed per-piece colvols
-- 92.0 ---------------------------------------------------------
Major Changes:
- Linux cross-distro binary builds
- much faster Sim (~20% and ~50% with working OMP)
- new cmdline arguments
- better pathing
- add experimental map generator (see for details)
- some new sim/weapon features
- Shard update
- AAI: refactor / fixes
- AAI: add BAR config
- AAI: update XTA config, to work with XTA > 9.71
- fix bug in /aikill
- new --download-engine
- fixes / speedups
- add c-api to shared lib & use it for pr-downloader
! fix return in GetInfoMapSize (#2996)
- no crashes in unitsync without init any more (#3120)
! ProcessUnits, GetUnitCount, GetMapCount, GetMapArchiveCount,
GetInfoMap, GetPrimaryModInfoCount,GetPrimaryModArchive,
GetSideCount, GetModOptionCount, GetCustomOptionCount,
GetSkirmishAICount, GetInfoValueInteger, GetInfoValueFloat,
GetOptionType, GetOptionNumberDef, GetOptionNumberStep,
GetOptionStringMaxLen, GetOptionListCount and GetModValidMapCount
returns now -1/-1.0f on error
! make TeamHandler::IsActiveTeam check Team::isDead
! gl.UnitPieceMatrix & gl.UnitPieceMultMatrix do now the same and work from UnitSpace & aren't recursive anymore (don't depend on the parent-piece)
! remove LuaLobby
- enable luasocket as default and always allow to listen (UDP & TCP)
- new Spring.GetTerrainTypeData (already on wiki)
- new Spring.GetUnitCurrentBuildPower(unitID) -> number 0..1
- new Spring.SetUnitNanoPieces(unitID, {piece1, piece2, ...})
- new Spring.GetUnitNanoPieces(unitID) -> table {piece1, piece2, ...}
- replace Spring.Echo with Spring.Log in most places in cont/
- LuaUnsyncedCtrl: make Spring.GetConfig* return non-nil (= 0) values when LuaModUICtrl=0 (3280)
- Lua: make Spring.GetPlayerRoster really return a boolean for spectator as the wiki says
- fix crash when calling Script.Kill() (3292)
- fix Spring.GetUnitNearestAlly takes self into account (3293)
- Spring.SetTerrainTypeData now only updates pathfinder when there is a real change (performance)
- fix crash in LuaUnitDefs when trying to read deathExpWeaponDef (#3333 & #3325)
- add Spring.GetReplayLength()
- add Spring.GetConfigParams()
- add Spring.GetUnitWeaponTryTarget(uid, wid, [number posx, number posy, number posz] | [number enemyid]) -> nil | boolean
- fix error spam on malformed Lua-issued unload commands (#3378)
- fix crash caused by comparing strings with numbers in base-content's weapondefs_post.lua
- add mapHardness to the Game constants table (#3390); make Spring.GetGroundInfo now match its wiki documentation
- make Create{Feature, Unit} take an optional (7th, 9th) {feature,unit}ID argument to spawn a feature/unit with a specific ID
- make CreateUnit take an optional (10th) builderID argument
! deprecate LuaUnitDefs.extractSquare
! replace LuaFeatureDefs.deathFeature(string) by LuaFeatureDefs.deathFeatureID(number)
- fix crash in Spring.GetVisibleFeatures (#3400)
- fix Spring.GetFeatureDirection returning direction in (x,z)-plane only (#1599)
! couple the AllowWeapon* callins to SetWatchWeapon state
- add optional 4th argument to Spring.SetUnitImpulse to control a unit's impulse decay-rate (now unhardcoded)
! Game.version now returns the same as `spring --sync-version`, e.g. "92.0" or "91.0.1-1283-gf3805a7"
- new Game.buildFlags (unsynced only) to get additional engine buildflags, e.g. "OMP" or "MT-Sim DEBUG"
- Better notification and protection from unbalanced OpenGL matrix stack after return from Lua rendering code
! drop support for ellipsoid-cylinders and ellipsoids
cylinders with round(!) baseplates are still supported!
simplify how damage from an explosion is calculated, fewer magic numbers, etc
no more distance approximations means no more invincible units (or features)
and no more general "weird" cases like 3103
! get rid of TYPE_FOOTPRINT, it was an alias for TYPE_SPHERE in the continuous case which is now default and the
original intent (a shape defined by the CSG intersection of sphere and footprint) would have been tricky to get
instead support a {Unit,Feature}Def key "useFootPrintCollisionVolume" which
makes a collision volume a box with dimensions equal to the object's footprint
(this overrides any custom scaling and/or offsets)
! let projectiles explode _on_ collision volumes and not in a interpolated pos in front of it
- rework projectile-vs-volume special cases so they can be distinguished better for the above
! rewrite TraceRay::{TestConeHelper, TestTrajectoryConeHelper} for #3399
these now no longer use any bounding-radius approximations to
figure out if an object will potentially be hit, but calculate
the exact colvol surface distance taking spread into account
- faster updates
- legacy: use omp in ::Update to multithread a function that eats 40% of the time spent in ::Update
- this gives a _massive_ boost with like >30% more FPS
- it needs low latency omp threads to work, those are currently broken in gomp, the bug will be fixed with the next release of gcc
- QTPFS: a lot of fixes & optimizations, fixed dev-build desync (#3339), made cache reads/writes atomic, read constants from MapInfo
- give pathfinder debug-data drawing its own shortcut (alt+p)
- rewrite collision handling between units and static objects (again)
instead of using impulse to push units away, do SCII-style strafing
! put on upper limit on directional slope tolerance for "downhill" slopes
before, units could move across ANY downhill slope if they ended up there
and directional checking was enabled; now the downhill slope-tolerance is
limited to twice the uphill tolerance
! set avoidMobilesOnPath to true by default again
pro: groups moving without a ctrl-order clump much less
contra: groups moving with a ctrl-order are less organized
- fix units moving orthogonally across too-steep faces (and getting stuck afterwards)
- fix humping triggered when unit crushes feature and feature spawns a non-crushable
replacement (if unit's next waypoint happens to be inside replacement's footprint)
- change precondition for crushing units from 'collider must be moving' to 'collider impulse must exceed collidee impulse'
- units that are mutually forbidden from pushing each other will no longer get stuck blocking the other party
- units moving toward the same spot will no longer clump up into a jiggly ball (#3355 & #3381)
- units with low delta-v no longer receive bogus move orders after being told to stop (#3358)
- actively push units away from speedmod=0 squares when possible
! LUS/COB: deprecate QueryNanoPiece() makes SimCode ~10% faster use the new Spring.SetUnitNanoPieces instead
Note, once set the engine won't call `QueryNanoPiece` anymore and instead randomly toggles between the set nanopieces,
saving a lot time-consuming COB/LUS calls.
! LUS/COB: cache QueryNanoPiece() results
Note, this stops QueryNanoPiece() calls after 31 times no matter what!
This breaks ZK's LupsNanoSpray, fixed version can be found here
- support a 2nd texcoord
- auto-calc midPos
- read texture filepaths from modelfile if available
- extended auto-finding of textures
! remove of manualBombSettings (backward-compatibility code in weapondefs_post.lua)
! fix: half craterAreaOfEffect the same way as it is done with damageAreaOfEffect
! removed color1 (hue) & color2 (sat). Use rgbColor instead!
! removed isShield. Use weaponType="Shield" instead!
- new 'interceptSolo', if true (=default) don't allow any other interceptors to target the same projectile
- allow any weapons to be interceptors/targetables (not that all combinations work/make sense)
! stop subs/AA-fighters trying to chase hovers and tanks (check all equipped weapons if they can target the unit, before _auto_ chasing enemies in FireAtWill)
! all weapons will now obey avoidFriendly, avoidNeutral, avoidFeature + avoidGround
! add new avoidGround weapondef tag (default true)
! remove "nodrawundergray" now that there is a proper "floating" tag
- a new GameID tag to script.txt
! always account local players (even when host is a spectator!)
! don't lower-limit gameSpeed to `userSpeedFactor * 0.5f` when userSpeedFactor is greater than 2
- make game ways more responsive when running at high speeds
- add /ReloadShaders
- less jerky camera transitions (thx cleanrock)
- make camera a bit smoother by adding some micro-transitions
- pressing F5 no longer hides the minimap in dualscreen mode (#3095)
- SMF/MapInfo: new tag voidGround
- fix 'only FreeCamera allows to set FOV ingame' (3291)
- do not spam unit self-destruct messages when spectating
- new configtag "StacktraceOnGLErrors": Create a stacktrace when an OpenGL error occurs (only available in DEBUG builds)
- fix performance leak in CSolidObject::Block()
- make UnitScript::{ScriptToModel, ModelToScript} O(1) instead of linear
(TODO: UnitScript::HaveListeners is another new O(n) source)
! remove OSC
- add new `cursorattackbad` mousecursor, used for static defense when giving a CMD_ATTACK
- get rid of the 'extractSquare' non-feature for extractor buildings
- when a team dies, redistribute unit-limits over the remaining teams in that team's allyteam (also means dead teams can no longer produce any units)
- record demos in-memory to make speccheating 1% harder
- make hovercraft with non-zero waterline transition into/out of water more smoothly
- make unit movement more physically-based:
add modrule 'allowGroundUnitGravity'; allows fast units to catch air
add modrule 'allowHoverUnitStrafing'; allows hovercraft to slide in turns
ground units cannot change speed or direction in mid-air
- in god-mode, units can now be selected and commanded by any player even when not spectating (#3412)
- fix multiple build-started sounds being played when ordering single builder to construct something
! UnitDef::can{Restore, Repair, Reclaim, Capture, Resurrect} now default to true only if the unit is
a builder and has the corresponding {Terraform, Repair, Reclaim, Capture, Resurrect}Speed property
set to a non-zero value
- speedup minimap icon rendering
- fix a few OpenGL errors reported by MESA drivers
- fix SimpleParticleSystem directional particles disappearing (#1665)
- ROAM: resize pool when running out of nodes fixes rendering on maps like Knockout
- disable occlusion query in BumpWater it doesn't work and just makes it slower
- move `lastFrameTime` calculation from the end of a drawframe to the beginning this way vsync locktimes are counted to the previous frame time
! removal of DepthBufferBits & StencilBufferBits
- BumpWater renders now with shadowmap & infotex
- clamp map ShadowDensity 0..1 (fixes shadow distortions on maps like Iamma)
- use VBOs for S3O and OBJ model piece geometry
- fix grass shadow rendering (no self-shadowing yet)
! changed `usable` range of GrassDetail configtag, so you can set it now >10 to increase viewrange w/o getting Tribble plushies
Sim Bugfixes:
! stop buildframe decaying on reclaiming
- fix unload commands close to map edges are ignored (3175)
- fix nukes (3269)
- fix some issues with bombers (3253)
- fix MANUALFIRE hangs despite no target lock
- fix gunship jumping on takeoff (3526)
- make sure unsupported build orders are never given to new factory buildees (3257)
- fix aircraft failing to land properly on repair pads (3260)
- fix gunships jittering when stunned (3262)
- fix builders 'ignoring' wait-orders when reclaiming
! fix units failing ground-attack orders when their "main" weapon != weapons[0] (3276)
logic change: MobileCAI::ExecuteAttack now cycles through all weapons until
it finds one which can execute the order, and no longer depends on weapon[0]
being the "main" weapon
- fix units gaining negative experience when shooting at dead targets
- fix old logic error in obstacle avoidance handling (IMMOBILE objects were being ignored --> no wonder the "infinite bouncing bug" was so pronounced)
- fix 'Crashing aircraft can be reclaimed' (3288)
- fix 'Units get stuck in sea labs on build completion' (3290)
- fix 'Paralyzed landed aircraft start moving forward slowly' (3287)
- fix bug reported by jamerlan (
- make HoverAirMoveType aircraft able to crash (3289)
- fix 'Move/Turn (piece) fails with negative speed' (3300)
- fix "Total velocity loss during a prolonged unit-to-unit [skidding] collision" (3302)
- fix 'Units with height advantage are unable to force fire with that range' (3303)
- fix air transports have trouble loading multiple units if units are large (3307)
- fix partly reclaiming factory allows unit teleportation/remote destruction (3308)
- fix 'SetFeaturePosition snapToGround get reset when there is terraform nearby' (3243)
! disable collision checking between transporter & transportee
- fix being-built units having order queues overwritten upon completion (#3342)
- fix FPE's in {Large}BeamLaserProjectile (#3413 & #3414)
- fix impulse not being applied to features (unit wrecks)
- allow underwater units to build stuff on the waterplane
- fix network connection is not properly closed when an error occurs in pregame (3166)
- extend desync message (send in debugmode for specs too and send correct & got checksum)
- fix "Transport endpoint is not connected"
- fix secret exploit
- fix secret exploit #2
- fix memory leaks, particularly when the game is minimized
- fix several crashes in multithreaded exe
Cmdline Arguments:
- new --game (-g) & --map (-m)
- if both parameters are set, this starts spring a with minimal setup and it sets the modoption minimalsetup = 1
- supports fuzzy search e.g. `spring -g ba -m Delta` or `spring -g zk -m "Delta X"`
- renamed shortarg -m (--minimised) to -b (~background)
- new `spring --list-def-tags`, will in future return all Unit-, Weapon-, FeatureDefs in a `--list-config-vars` manner (not finished yet)
- new benchmark mode (`--benchmark %time_min --benchmarkstart %starttime_min`) writes a parsable by gnuplot
- set affinity of omp threads
- search script.txt & demofiles in $PWD
- detect Valgrind and disable Watchdog & syncing (it won't let us change the FPU state) if it is running
- don't install crash handler when core dumps are enabled
- boost 1.50 compatibility
- detect and compress debugsymbols
- update 7z to v9.22
- use tcmalloc when found (new USE_TCMALLOC use-flag)
- add target headercheck
- OpenMP build
- update to boost 1.50
- slightly improve speed of zip / sdz archives (#3338)
- Nvidia Optimus support
- removed springsettings.exe as its directly included in springlobby
- Linux's ctrl+c: `hardkill` after 10sec (and 5 seconds softkill)
- workaorund issue in FOSS ati drivers with NPOT cursors
-- 91.0 ---------------------------------------------------------
- fix Linux sync errors
- fix QTPFS deadlocks
-- 90.0 ---------------------------------------------------------
- fix endless loop in Shard in mingw32 builds
- fix builders sometimes don't notice when a building was finished by another unit
- fix SkyBox corruption
- fix QTPFS deadlock at start
- partially revert the "lock-on targeting" behavior:
If a user-selected target moves out of range, the lock is
now broken as it used to be and automatic targeting is not
blocked anymore (though this can take some SlowUpdate's).
For ground-attack orders it is still in place, since the
behavior seems to be preferred (so a unit that is told to
attack a position and then to move away will keep firing
even when other targets are available)
- really fix "endgame stats only show APM for self"
- really fix "Size of unidentified radar blips can be determined with mouseover"
- fix ship wreckage drag
- fix gunships don't obey land/fly state
- fix 'Bombers with fight command do not fire' (3190)
- fix 'Emit-sfxed weapons point at {0, 0, 0}' (3205)
- fix an incorrect watchdog trigger before gamestart
- fix 'Aiming animations ignore maxAngleDif [actually tolerance]' (3180)
- fix 'Grass is not animated in LOS view' & 'LOS view does not render trees in the same way' (3207 & 3203)
- fix `halo` in BumpWater with EndlessOcean & OwnRefractionRenderPass
- fix 'Bombers with area attack dont work ' (3195)
- fix 'If air constructor lands it often fails to do next construction command' (3198)
- make fight commands work with noAutoTarget weapons (3190 #2)
- fix 'Constructor stops before it enters build range' (3210)
- fix bugged/all-white decals when shadows=0
- fix units being able to move down steep cliffs (directional slope-tolerance needs work)
- fix dangling pointer/memory corruption in QuadField (3211)
- fix 'Reclaiming units under construction results in no resources being returned' (3216)
- fix some OpenGL usage errors found by [teh]decay
- fix 'Gunships dont always aquire targets despite fireatwill+roam+fly' (3221)
- fix 'TargetBorder=1 only works when a unit has a specific attack command' (2971)
- fix CFeature::ForcedMove (3226)
- fix Spring crashes when sending large messages (3228)
- fix 'Armed constructors attack neutral units on Fight order'
- restore old shield visibility behaviour (3242)
- fix 'Units with cannons remain out of range when you force fire onto high ground' (3241)
- disable unit pushing bidirectionally when one of the parties is non-blocking
- make target locking optional via meta-key
- support start-scripts of arbitrary size (still not advised to use scripts bigger than 256kB, and we won't optimize anything related to such huge scripts)
- make cloakCostMoving default to cloakCost
- change default weapon "mainDir" to "0,0,1" (before it was "1,0,0")
- always enable continuous hit-testing (it showed discountinuous one is used <<1%, so it's not worth to keep it)
- add explicit `floating` featureDef tag (before it was implicit via nodrawundergray and failing a lot)
- add Spring.SetUnitDirection(unitid, x,y,z)
- add `ignoreLOS` tag to Spring.UpdateMapLight
- LuaRules: add DrawProjectile to complete the Draw* quartet
- add `allowAircraftToHitGround` tag (3199)
- runtime create missing DDS mipmaps when supported by the hardware
- call SDL_WarpMouse every frame again (fixes `ghost mouse` in middle click scroll)
- explicit pipe --large-address-aware through -Wl (fixes compiling with tdm-gcc)
-- 89.0 ---------------------------------------------------------
Major Changes:
- LuaSocket
- MessageBox for unsupported GPUs (+drivers)
- fixed ATi PointSize bug
- LOS et al. are rendered now through the GLSL terrain shader (-> shadows in LOS-view)
- added Shard to the windows installer
- added pr-downloader as submodule (only compiled if libcurldev is available)
- limit infolog.txt buffer to 8kB
- open a MessageBox on systems with unsupported GPUs (+drivers) on engine start (suppressible with a config-tag)
! remove selectkeys.txt support (use uikeys.txt instead)
! remove TASServer.jar (outdated, use )
! send gameID and SDF filename with SERVER_STARTPLAYING to autohost
! remove deprecated LogSubsystems config var
- do not send GameOver from a client that timed out
- add LogFlush config var for instant writes (disabled as default)
- add UI config-variables AutoAddBuiltUnitsToFactoryGroup (def: false) and AutoAddBuiltUnitsToSelectedGroup (def: false)
if the first variable is true, new units auto-inherit their group number from the factory that built them
if the first AND second are true, new units are auto-selected if their factory group is currently selected
- weapondefs.cylinderTargetting spelling fixed, the old one is deprecated
- exit with !=0 if spring can't connect to server
- decrease loglevel for "Load S3O texture now" & luasocket
- change content-exception (for a missing water texture) in BasicWater to a warning message
- dedicated server no longer consumes 100% CPU while waiting for gameID
- headless builds use less cpu-time (nominally 50% instead of 100%)
- fix some orders are discarded when issuing commands to landed planes
- fix unfinished units with 100% hp can't be finished
- fix 'crash when getting LOS of a feature without 3d object and drawType!=-1' (3032)
- fix "changing unit speed does not work anymore" (2877/3016)
(scripts can now arbitrarily override the UnitDef values, which are only used for initialization)
- fix 'LightningCannon can fire into water' (3057)
- fix BeamLasers and LightningCannons not ignoring stunned shields
- fix GameSetupDrawer player-state string (3064)
- fix 'Con/com gets weird move order after stop command is given' (3069)
(was intended to keep factories clear, any side-effects are up to players to deal with)
- fix stunned=true crashing=true airplanes falling into the void (3078)
- fix zombie coverage from sensor-units (if activated while in a transport, exploit)
- fix crash in unit_script.lua
- fix 'Units stuck in factory' QTPFS bug (3055)
- fix units moving (being pushed) through factory walls
- fix terrain water reflections
- fix game does not end properly for a player that is being kicked
- fix problem to build near map edges
- fix ping display after mid-game (re-)join + try to reduce lag after mid-game join
- fix missing stack trace if out-of-memory occurs
- fix missing stack trace on abnormal termination (sigabrt)
- fix resurrecting an individual wreck results in the resurrector not healing it
- fix /godmode and /{luarules,luagaia} {reload,disable} not working in demos (2701)
- fix targetting bug (weapons sometimes failing to fire at badTargetCategory units) as a result of AllowWeaponTarget misuse
- fix kamikaze units not self-d'ing when given an attack order while on hold-fire (2405)
- fix 3105 (PlayerChanged callin not available in unsynced gadgets)
- fix 2947 (size of unidentified radar blips can be determined with mouseover)
- fix 1843 (Spring.GetUnitHealth returned nothing for buildProgress on in-LOS enemy units with "hideDamage=1")
- fix 3122 (failure to fire at badTargetCategory)
- fix crash when give all units to uncontrolled team
- fix fighters that have a target may refuse to obey orders
- fix crash in GetPlayerTeam (AI)
- fix sync warning when resizing the main window
- fix ctrl/alt/shift keys stuck after alt tab
- make COB's set(MAX_SPEED) permanent again like its Lua counterpart, rather than
letting it apply only temporarily (for the duration of the current move command
if any); use negative speed values if you want the change to be non-permanent
- YardMap changes:
- more verbose yardmap parsing
- ignore any whitespaces in yardmap strings (esp. newlines)
- new "i" yardmap code (inverse of "c")
! remove TA-ism in buildrange code:
! make buildrange not immobile dependent
! changed terraform range check a little
! make terrain restore range check consistent with new terraform one
! don't add target's radius to the builder's builddistance, only do so if the target is bigger than the builddistance (mostly only true for terraform)
-> from now on the to be built unit's centerpos has to be in buildrange not its border!
! remove obsolete default dependence of cloakCostMoving on cloakCost
! remove modelCenterOffset tag (can now be dynamically set with Lua)
- improved behaviour of builder masses
- make StartBox clamping of StartPositions synced
- don't reclaim in-the-way features when the buildee is going to morph into a feature of the same type
(fixes the ancient bug where ordering a row of features with N > 1 builders causes each to be reclaimed and then immediately rebuilt)
- do not apply impulse to units being transported
- make falling wreckage (from aircraft) not lose all its forward speed
- make ground units consume waypoints less aggressively
- remove special treatment for collisions between mutually-pushResistant objects for 3031
- add 'allowUnitCollisionOverlap' (def=true) and 'useClassicGroundMoveType' (def=false) ModInfo keys
the former allows unit movement like at the cost of more clumping (learn to use ctrl+lmb formation orders)
the latter is a ticket back to unit movement circa 2009: no reversing, no turninplace=false, no smooth collision handling, no nothing (figure it out)
- add mod-rule 'targetableTransportedUnits' (default false)
- introduce an independent Lua-controllable aim-position (defaults to mid-position) for units and features, used by weapons as their aiming/target point
- make ground units less keen on repairing fast units such as patrolling aircraft
- fix distinction between user-selected and internal CommandAI targets
- QTPFS: less loadscreen spam, make F2 functional, enable corner-connected node topology, use staggered layer-updates, speedups and tweaks
- QTPFS: increase MAX_TEAM_SEARCHES, decrease LAYERS_PER_UPDATE (more units can request paths per frame, units get paths back more quickly)
- QTPFS: fix assertion failure, make execution of path requests more asynchronous
! some config values are now write protected (Spring.SetConfig*)
- added luasocket support for widgets, see
- fixed params of Spring.MarkerAddPoint & Spring.MarkerAddLine
- call AllowWeaponTarget at the end of the queue, so lua only gets those units which are _not_ filtered by the engine
! LuaSyncedRead: better hide enemy radarblobs unit-info
! MoveCtrl: remove SetGroundMoveTypeData(unitID, "wantedSpeed", v) and SetGroundMoveTypeData(unitID, "maxWantedSpeed", v)
(the preferred way for gadgets to change a unit's speed is by calling SetGroundMoveTypeData(unitID, "maxSpeed", v))
! replace Game.gameID by synced callin GameID(string gameID)
- fix TraceScreenRay never returning "sky" when includeSky=true
- fix TraceScreenRay coordinate offset when onlyCoords=true
- fix typo in Spring.GetUnitVelocity
- add extra parameter 'defPriority' to AllowWeaponTarget (what the engine thinks the target priority should be)
- add bool FeatureDefs[xyz].autoreclaim
- add new gl.Texture("$minimap")
- add new gl.Texture("$info")
! remove gl.SelectBuffer and co.
- new Spring.LoadCmdColorsConfig(configStr) & Spring.LoadCtrlPanelConfig(configStr)
- add new 3 param 'pairwise' to Spring.GiveOrderArrayToUnitArray(), used to send multiple units a single individual command
- fix crash due to UpdateCallIn removing the current event client from list being iterated
- add missing team/player callins to (unsyced) GadgetHandler
- add new synced callouts Set{Unit,Feature}RadiusAndHeight(number id, number radius, number height) --> boolean
- add new synced callouts Set{Unit,Feature}MidAndAimPos(number id, number mpx, number mpy, number mpz, number apx, number apy, number apz) --> boolean
- add optional 2nd (boolean midPos) and 3rd (boolean aimPos) arguments to Spring.Get{Unit,Feature}Position to go with the above four callouts
! change Spring.GetUnitPosition to return a unit's base-position by default, like .GetFeaturePosition does for features
(this is usually a point on the model closer to the ground than its mid-position, so may affect some Lua drawing code)
- fix keys hang after LuaUI tweakmode
- [MT] disallow other Lua environments to invoke LuaUI if LuaThreadingModel = 2, to prevent deadlock
- [MT] fix desync with LuaThreadingModel > 2
- [MT] fix teams sometimes wrong in UnitGiven() and UnitTaken()
- fix DynWater ship wakes, BumpWater shorewaves
- fixed ATi PointSize bug
- update assimp to svn rev 1231
- fixed assimp lua metafiles
- warn about null normals in models
- add visualization of default object radii (used for AOE calculations, etc) to alt+v
- SMF: render the info-texture through GLSL (noob translation -> shadows in LOS-view)
- improved VSync under Linux (with support for AdaptiveVSync)
- added FeatureFadeDistance & FeatureDrawDistance config tags
- more failsafe shadow FBO creation
- fixed vibrating planes (again)
- fix spring_multithreaded hangs
- display average draw & sim frame time in debugview
- draw buildRange for mobile selected units too & always render them on shift hover (also for shield range)
! all items in sounds.lua are now converted to lowercase
- allow to create a new "default" item in sounds.lua
- WeaponDef: support 'soundHitWet{Volume}' keys for in-water explosion sounds
(the 'soundHit' key is now deprecated in favor of 'soundHitDry')
- set IMAGE_FILE_LARGE_ADDRESS_AWARE (increased >2GB memory limit)
! strip CXX_FLAGS & C_FLAGS in build process to prevent sync incompabilities (can be turned off with a new CUSTOM_CFLAGS cmake flag)
- on multicore systems set scheduler to SCHED_BATCH (semi-solves the core hoping issue)
- call SDL_WarpMouse only when needed (fixes massive FPS-drop in middle-click-scrolling)
- use a non-locking vsync mechanism & add support for nvidia's `adaptive vsync`
- explicit disable all CPU extensions except SSE1
- use mtune=generic on 64bit systems
- fix stack corruption in sound code
-- 88.0 ---------------------------------------------------------
! showing collision volumes has now its own command (`/debugcolvol` & `alt+v`)
! use footprint (not model) radii for obstacle avoidance
- improve reconnecting sim/draw balance
- disable line/point smoothing in safemode
- time profiler updates now even when paused
! MoveInfo read "avoidMobilesOnPath" from correct table and disable it by default (before it was default enabled)
! allow to list files with unsolveable depends
- warn about usage of deprecated functions in unitsync
- added new Spring.TestMoveOrder(unitDefID, worldx, worldy, worldz) -> boolean
- added new Spring.Log()
- same as Spring.Echo, but passes metadata to the logsystem
! to be able to use LOG.XYZ you need to update your system.lua
- Spring.Log(string logsection, int loglevel, ...) (with loglevel either: LOG.DEBUG, LOG.INFO, LOG.WARNING, LOG.ERROR, LOG.FATAL)
- Spring.Log(string logsection, string loglevel, ...) (with either: "debug", "info", "warning", "error", "fatal" [lower-/uppercase doesn't matter])
- fixed WeaponDefs[123].pairs()
- added myGravity tag to WeaponDefs[] table (thx DeadnightWarrior)
! distinguish water-damage in Unit{Pre}Damaged
- water damage has index -5
! kill damage was -5 before and is now -6
- fixed multiple crashes
- fixed gcc i686 march flag
- fixed an aircraft refueling bug
- fixed multiple pathing bugs/issues
- fixed crash at startup when DynamicSun=1
- fixed 'Nanoframe targeting and water' (3017)
- fixed desync _warning_ between 32- & 64-bit systems
- fixed FarTextures with GPU/drivers that don't support FBOs
- fixed spring-mt & spring-safemode links in window's startmenu
- fixed incorrect drawMidPos (e.g. used for command line drawing)
! add vcredist_x86.exe to the installer / remove MSVCR71.dll from mingwlibs
- fixed safemode shortcuts
-- 87.0 ---------------------------------------------------------
! restore pre86.0 maxAngleDif arcs
! remove the following Lua consts: wdef[id].areaOfEffect, wdef[id].maxVelocity & wdef[id].onlyTargetCategories
- fix "LuaUI didn't got unprocessed /xyz commands" (mantis 2982)
- fix shield rendering
- support for zlib 1.2.6 (thx sirmaverick)
- fix crash on start when invalid ai is in script.txt
- fix multiple pathing & collision issues
- some Maven (Java) updates
! removed ArchiveMover
- fix compile for "make tests" on win32
-- 86.0 ---------------------------------------------------------
- new commandline argument "--safemode": It turns off all features that are known to cause problems on some system.
! ignore features with `blocking=false` in all RayTracing/Aiming functions (other code still checks them!!!)
- enable ROAM in spring-mt
- IsolationMode: scan ENV{SPRING_DATADIR} & config's SpringData as readonly datadirs
- using now OS functions to expand special paths in spring's include dirs (config's SpringData, ENV{SPRING_DATADIR}, ...)
! Windows: now uses windows syntax ("$HOME/foo/bar" is now "%HOME%/foo/bar") (see msdn's ExpandEnvironmentStrings documentation)
- Linux: now supports full bash path syntax ("~/", "${HOME}/.spring/", "/foo/../bar/", etc.) (see manpage of wordexp)
- remove "Start SpringSettings" and "Start the Lobby" from the test/develop menu
! remove support for selectionkeys.txt
- add internal_pthread_backtrace for freebsd
- update mingwlibs (fixes rotated textures)
- make globalLOS a per-allyteam variable
/globallos <n> --> toggle for allyteam <n>, no argument --> toggle for all
fix several minor issues and corner cases
support partial searches, allow search to start from blocked nodes
tweak heuristic so it overestimates less on non-flat terrain
do not let units move before path-request is processed
- UnitDef: add turnInPlaceAngleLimit tag
for a unit with turnInPlace=true, defines the
maximum angle of a turn above which it starts
to brake (defaults to 0.0, values in degrees)
- MoveDef:
unhardcode default pathfinder cost-adjustment and
speed-multipliers for squares blocked by *mobile*
avoidMobilesOnPath = boolean,
speedModMults = {
mobileBusyMult = number,
mobileIdleMult = number,
mobileMoveMult = number,
unhardcode the DepthMod equation:
depthModParams = {
minHeight = number,
maxHeight = number,
maxScale = number,
quadraticCoeff = number,
linearCoeff = number, -- deprecates "depthMod"
constantCoeff = number,
new formula is given by
if h < depthModParams.minHeight: 1.0
if h > depthModParams.maxHeight: 0.0
depthScale = MAX(0.01, MIN(depthModParams.maxScale, (a * h * h) + (b * h) + c))
depthMod = 1 / depthScale
h = unit's absolute height below water surface
a = depthModParams.quadraticCoeff
b = depthModParams.linearCoeff
c = depthModParams.constantCoeff
- reload IsolatedMode & Dir via the EnvVar on Init() calls
- warn about invalid version numbers
- add python bindings for unitsync
- fix signal handling
- use native DialogBoxes
- cleanup and extend SSMF shader, now includes a parallax-mapping stage
- add LuaRules callin `DrawShield(number unitID, number weaponID) --> boolean`
(true skips Spring's own drawing of shield <weaponID> owned by unit <unitID>)
- make LuaUnsyncedCtrl::SendSkirmishAIMessage return a table, not N loose strings
(but note there is nothing in this table due to "limitations" of the AI interface)
- add weaponDefID parameter to ProjectileCreated
- add facing parameter to AllowUnitCreation
- remove most range-checks in default gadget-handler for registering commands (2930+2952)
- distinguish damage-types for Unit{Pre}Damaged when weaponDefID < 0 (2966)
weaponDefID -1 --> debris collision
weaponDefID -2 --> ground collision
weaponDefID -3 --> object collision
weaponDefID -4 --> fire damage
weaponDefID -5 --> kill damage
- fixed Intel GPU detection under Windows
- fixed handling of duplicated used hotkeys (i.e. unit groups & specteam switching)
- fixed minor issues with ground collision RayTracing
- fixed compilation with boost >=1.48
- fixed Spring.Restart
- open logfiles on win32 with commit flag set
! don't allow spring to start when a depend file is missing
- "Rapid unit ejection from factory" (2864)
- "Units walk in circles on their way to a far awar move goal" (2866)
- "Excessive movement bouncing off buildings and wreckages" (2865)
- "armpw stuck in air while pathing around solars" (2854)
- "Enemied units can get stuck in each other with movectrl" (2832)
- "A factory set to wait continues the queue" (2868)
- "Change in Factory Behaviour wrt AllowUnitCreation" (2873)
- "Building with Meta-Key pressed does not work" (2764)
- "'Move at slowest speed of group' move order (ctrl+alt) semi-permanently changes unit maxvelocity." (2880)
- BeamLasers could hit but not damage units using per-piece colvols
- heap corruption in UnitDrawer::ShowUnitBuildSquare (2903)
- heap corruption in TransportCAI::UnloadDrop (2911)
- mismatched feature colvol matrices
- MoveCtrl.SetRelativeVelocity
- bug in TestTrajectoryCone for ballistic weapons
- transported units being unhittable (2875, 2934)
- SetUnitCrashing inconsistency, caused "Aircraft crashing while landed results in irregular behavior" (2924)
- obscure targetting bug, caused "Gunship jams when on hold fire" (2406)
- deprecate / remove the 'toAirWeapon' WeaponDef tag
(use "onlyTargetCategory = VTOL" for the same effect)
- 'airmesh is 0 at x >= width or z >= height' (2938)
- GuiHandler crash when unit has no valid selfDExplosion (2852)
- <canSubmerge=false, floater=true> aircraft landing on sea floor (2856)
- 'waterweapon=false BeamLaser can fire into water' (2857)
- the units-humping-obstacles syndrome (forward and reverse)
- silly aircraft refueling bugs
- 'Warning message on SetGroundMoveTypeData(unitID, "maxSpeed", 0)' (and some related possible div0's)
- weird inability of weapons with a non-default onlyTargetCategory to attack the ground
- 'Unit LOD billboards are too dark' (2948)
- rare antinuke bug (2956)
- typo in setting of default turnInPlaceSpeedLimit
- "All terrain units move commands are removed when climbing cliffs" (2958)
- 'Landed gunships do not follow height reduction' (2823)
-- 85.0 ---------------------------------------------------------
Major Changes:
- ROAM \o/
- QTPFS (disabled by default)
- updated man-pages
- added new argument `--sync-version` (i.e. prints "85" for a 85.0 build or "84.0.1-567-g69ef7a3 develop" for a dev build)
- allow to build proper release builds without being on branch master
- added a full set of new arguments to spring-dedicated (see `spring-dedicated --help`)
- added --isolation & --isolation-dir arguments
- optionally, you may supply a path with SPRING_ISOLATED=<isolation-mode-dir>
- added ROAM. Kudos go to B. Turner (the original author of the code) and Beherith (for integrating it into Spring).
- set SmoothLines & SmoothPoints by default on DONT_CARE (so your gfx driver settings decide if it is enabled or not)
- dynamic viewrange handling, so even a 32x32 map can be rendered w/o clipping in low camera angles
- log available video memory on NVidia/ATi gfx drivers
- disable GLSL shaders on Mesa/Intel drivers
- re-added forced log file flushing when handling crashes
- made the (new) C++ AI Wrapper VS compatible
- name threads so you can identify them in `htop` (Linux only)
- some additional time-profilers in rendering code
! hide "(Headless)" in dedicated's returned version name
- fixed stacktrace translation with some Linux setups
- fix crash when specs are cheating in via /team
- fix transport loading failure
- fix keyshortcuts (handle F3 OR any+F3 but not both at once!)
- fix EndGameBox
- make F2 colors less ambiguous
- the ManualFire action now expects a cursor "cursormanfire"
- make units crushable like features
- implement avoidFeature for Cannons and MissileLaunchers
- fix extremely fast unit rotations after being hit
- fix FPS-mode range exploit
- fix teleport-to-smooth-mesh after unloading
- fix units sometimes moving onto impassable squares
- fix the mass-clumping unit movement bug
- properly restore MoveType::maxSpeed after a guard-order
- prevent units getting stuck when turning around the corner of other units
- give warning when textures used in SimpleParticles don't exists
- really fix default projectile colors
MultiThreaded (GML):
- fix hang/runtime error during pathing
- fix Creating unit in gadget:Initialize()
- lots of other fixes
- limit UnitReplies to max one concurrent playback
- play most unit sounds (activate, ...) only if unit is in LOS
! removed "commander" tag (The Commander selectkeys filter is now defunct (ctrl+c hotkey). Lua it, or add a new one that looks for any canManualFire units.)
- added new "blocking" bool tag
! "canDGun" is now a synonym for "canManualFire"
- added new tag "crushResistance" (defaults to unit's mass)
! make the default cloakCost* values 0 instead of -1,
! added new "canCloak" bool tag (If an unit can receive user cloak commands. Before, canCloak was auto set to true if cloakCost >= 0.)
- added new tag "crushResistance" (defaults to feature's mass)
- added new "craterAreaOfEffect" float tag (defaults to the value of areaOfEffect)
- added "movement.allowCrushingAlliedUnits" (default false)
- added "movement.allowUnitCollisionDamage" (default false)
- added "system.pathFinderSystem" (defaults to 0, 1 is QTPFS)
! UnitDef[].isCommander returns now false
- fixed Spring.GetTimer/DiffTimers
- fixed Spring.SetMouseCursor when using hw cursor
- handle Lua code crashes in some events correctly, so they don't crash the whole Lua enviroment (fixes: "LuaRules::CheckStack top = -1")
! call UnitMoveFailed event only for via Script.SetWatchUnit registered UnitDefs
! added new WeaponDefs[].craterAreaOfEffect
- extend Spring.SetUnitBlocking with an optional 4th "crashable" bool argument
- added new Spring.GetUnitBlocking(unitid) -> blocking, crushable
demo widgets:
- minimap_startbox.lua: play sound when start-positions are placed
- create spring_${VERSION}
- if Init() is called, but we are already initialzied, do a re-initialization
-- 84.0 ---------------------------------------------------------
Bugfixes & Improvements:
- reduced 'Got invalid Select' message spam
- hide framNums from chat console
- fixed command queue bug (zombie builders)
- always flush stdout/stderr
- workaround a SDL bug with X11 & fullscreen that broke MiddleClickScrolling
- changed target behavior of enemies outside of LOS
- fixed BumpWater with DepthBufferBits=16
- fixed aircraft landing on repairpads
- reset aircraft state after starting from repairpad (`ground hover bug`)
- make UHM available before the gamestart (fixes Spring.GetGroundHeight in :Initialize() etc.)
- workaround 'Bertha' issue (UHM related)
- make C++ AI Wrapper compile with VS
- fixed fog in some shaders
- fixed F2 view
- improve weapon interceptors (anti nukes can now intercept nukes that fly over them)
- fixed free resources by NanoFrameDecay
- handle resigned players (:= /spectator) in game_end.lua gadget
- Lua Spring.KillTeam: disallow killing of Gaia (engine doesn't support so atm)
- fixed lasers not hitting targets at edge of range
- fixed stutter with low-reloadtime weapons
- Lua: removed WeaponDefs[i].graphicsType & renamed WeaponDefs[i].hardStop -> WeaponDefs[i].laserHardStop
-- 83.0 ---------------------------------------------------------
Major Changes:
- EFX/EAX support (sound reverb)
- ASSIMP support (not 100% finished yet)
- AI Interface pure-ification
- many speedups and double as much slowdowns
- use a new engine versioning scheme (RC12)
- use more smooth algorithm for wind updates
- fixed a few focus lost issues (keyboard & mouse)
- DebugMode now draws feature collision volumes too
- made ShadowSpace linear
- multithreaded loadingscreen
- hide out-of-LOS heightmap changes
- replace engine start point marker with lua-widget
- use "game" instead of "mod" in many places
- add "isolation" mode (do not use global data-dirs)
- change lobbyserver main address to ""
- use everywhere (deprecate clan-sy links)
- ArchiveMover uses unitsync to detect the writable data dir
- improve version logging on non-Windows OSs
- include player-name in log message when resingning
- add `../` as data-dir if it contains `maps/`, `games/` and `engines/`
- allow to define the default config- nad data-dir on windows, using env var PROGRAMDATA
- refuse to load too heavily compressed archives (see 0.82.3-1043-g2c15040 commit message for details)
- better IP v6 and v4/v6 mixed mode support
- lots of error messages improved and new ones added
- add the first few unit-tests
- add a validation-test
- add network bandwidth limits per player to prevent malicious command spam
- add optional high-loss network modes to make spring playable on very lossy connections (NetworkLossFactor = 0|1|2)
Engine / bugfixes:
- too many to list, see (incomplete!)
- calculate the team unit-limit without ancient hacks
- stop the maxunits team restriction from applying to Gaia (#2435)
- fix ray-ground intersections when camera is outside map
- fix spring on MacOSX
- CMake configure and make build are much more stable now (no more failure due to wrong order of actions)
- fix DamageArray related sync error
- fix a lot of memory-leaks
- fix unit does sometimes not reach target position when given a restore command
- prevent build time-out when builder or other units are blocking the build pos
- fix "cheat" status disparity between server and client after watching demo
- fix captured unit still getting shot at
- fix repeat commands remain even if the target object is destroyed
- fix unwanted error spam when disconnecting from server
- fix reconnect failure (incorrect password)
- fix rare desync and keyframe mismatch after reconnect
- fix two crashes related to audio channels
- eliminate some false hang detections on load
- fix multithreaded crash in lua material rendering
- fix hang after crash
- fix memory corruption in bitmap handling
- fix desync in PieceProjectile (#2591)
- fix a certain /take exploit
- fix hover aircraft may become unresponsive in conjunction with command chains and repeat enabled
Engine / misc defs:
- replace UnitDef::pieceTrailCEG* by a Lua subtable of sfxTypes
- deprecate several *Def tags and their Lua*Defs copies (type/maxSlope/isBuilder/canDGun/transportableBuilding/dropped/canCrash/...)
- make a missing UnitDef::humanName non-fatal
- UnitDef: remove hardcoded: if ((waterline >= 5.0f) && canmove) { waterline += 10.0f; }
- make UnitDef::losHeight configurable instead of an unused hardcoded value
- add collide{Enemy, Ground} as weapondef tags
- use a more reasonable default for FeatureDef.autoreclaimable (== reclaimable)
- scan in 'effects/' as well as 'gamedata/explosions' for CEG definitions