Jan 31, 2022
Left 4 Dead - Kerry
An update has been released for Left 4 Dead.

- Fixed a potential remote code execution exploit through malformed file uploads. Reported via HackerOne.
Left 4 Dead 2 - Kerry
An update has been released for Left 4 Dead 2.

- Improved dedicated server searches to return lower-ping servers closer to the lobby leader's local region.
Left 4 Dead 2 - Kerry
Changes in this update:

- Fixed some incorrect disconnect messages.
- Blocked an exploit that could be used to crash servers.
- Added a Mulitplayer Option to disable sprays to prevent other players' sprays from appearing on your client.
- Temp files are removed from disk after each session. Use "l4d_delete_temp_files 0" to disable this.
Left 4 Dead 2 - Kerry
An update next week will contain a change that clears temp directories when you exit the game. This will delete any spray files that have been downloaded from other players during the session. If you do not want your temp files to be deleted, you can set "l4d_delete_temp_files 0" to disable it. In the meantime, if you're really attached to your spray collection, you may want to copy them somewhere safe now in case you forget to set the convar next week.
Aug 20, 2021
Left 4 Dead 2 - Kerry
An update has been released for Left 4 Dead 2

- Fixed several more RCE exploits.
- Fixed a network exploit that could crash servers
- Fixed a networking error when using the defibrillator
- Fixed rendering errors when underwater
Aug 10, 2021
Left 4 Dead - Kerry
An update has been released for Left 4 Dead

- Fixed Authoring Tools failing to write to disk
Aug 9, 2021
Left 4 Dead - Kerry
An update has been released for Left 4 Dead

- Fixed several potential RCE exploits.
Left 4 Dead 2 - Kerry
An update has been released for Left 4 Dead 2

- Fixed splitscreen break. One of the RCE attack vectors fixed in the previous update crossed paths with splitscreen connections. The exploit is still fixed, but splitscreen connections are now allowed to proceed as usual.
Left 4 Dead 2 - Kerry
An update has been released for Left 4 Dead 2.

- Fixed a crash when skipping the intro movie with a controller
- Set FOV value as archived
- Inverted brightness slider to be more intuitive
- Fixed a crash caused by an out-of-bounds memory write in the common infected shader
- Improved performance of "IsL4D1Campaign" query, and exposed the call to script
- Water slowdown is disabled only when playing L4D1 Versus or L4D1 Coop mutations in original L4D1 maps. New script variable "WaterSlowsMovement" can manage the feature for other custom modes.
- Numerous security and exploit fixes
Jun 15, 2021
Left 4 Dead 2 - Kerry
An update has been released for Left 4 Dead 2.

Bug Fixes
- Fixed file path for CricketBat.Miss sound event.
- Fixed muzzle flash occurring if you melee immediately after shooting.
- Fixed a crash on zero-byte VPKs.
- Fixed a startup crash on Linux.
- Fixed some memory leaks in VGUI.
- Fixed text corruption when using emojis in player names or text.
- Fixed some text corruption related to UTF-8 conversion in some instances on Linux.
- Fixed some out-of-bounds reads with weapon indices.
- Fixed fps_max being reset when loading a new map.
- Fixed custom maps with no lights disabling lighting for the rest of the play session (mat_fullbright).
- Fixed addon info being truncated much earlier on Linux.
- Fixed selecting certain audio/video options via navigation via arrow keys or controller.
- Fixed Widowed (No Border) option on Linux.
- Fixed a crash if a script call to QueueSpeak() didn't pass any modifiers.
- Fixed a possible crash if a script-defined forbidden target is destroyed.
- Rebuilt gas can physics to fix an issue with falling through the world.
- Fixed an issue in Rocket Dude with a player getting moved to spectator after a level transition.
- Fixed two malformed player clips in c4m1 and c4m5.
- Fixed some incorrect place names in Cold Stream nav.
- Restored some missing commentary entities in c5m5.

Features and Updates
- Added a Vulkan render backend (currently accessible through the -vulkan command line parameter).
- Better support for ultrawide monitors in the UI and game (requires Vulkan if using Linux)
- Marked the game as DPI-aware for high DPI displays.
- Improved default settings for window size and type.
- Improved full-screen quad rendering performance.
- Made captions anti-aliased
- Marked fps_max and viewmodel_fov as FCVAR_RELEASE.
- Cvars 'survivor_incap_health' and 'survivor_incap_decay_rate' can now be changed after startup.
- New cvar 'charger_pz_claw_damage'; functions the same as equivalent melee cvars for other specials.
- New archived cvar "addons_hide_conflict_dialog" suppresses the warning dialog in the addons screen. Any conflicting addons will still be highlighted in red with conflicts printed to the console.
- Added an FOV slider to the Multiplayer settings.
- Added a +bench_demo [name] <stats output>  command line parameter which will run a demo, and quit after it is finished.
- Added a -bench_settings [name] command line parameter to load a cfg/video_bench_{name}.txt file containing settings to load. There are a set of defaults provided, very_high_4k, very_high, high, medium and low.
- Lobbies that connect via a forced server IP are not considered for "Official Only" Quick Match searches.
- Overhauled UI usability on controller
• Added controller button icons across the UI.
• Made confirmation prompts accessible on controller.
• Now able to select mutations on controller.
• Now able to fully manage lobbys on controller.
• Now able to manage addons on controller.
• Now able to browse achievement details on controller.
• The game instructor (in-game hints) now shows controller buttons and hints.
• Added a flashlight binding to the default controller config.
• Made the intro video skippable by any button on a Steam Controller.

New Scripting Hooks

Global
FindRescueAreaTrigger() - Returns the trigger entity for the rescue area
GetDifficulty() - Returns the current difficulty as a numeric value
GetDifficultyString() - Returns the current difficulty as a string
HasConfigurableDifficultySetting() - Returns true if the mode supports more than a single difficulty
IsMissionFinalMap()
GetScavengeItemsGoal()
GetScavengeItemsRemaining()
SetScavengeItemsGoal()
SetScavengeItemsRemaining()

TheDirector
AreAllSurvivorsInFinaleArea()
AreTeamsFlipped()
GetMapNumber()
IsAnySurvivorBypassingTank()
IsAnySurvivorInExitCheckpoint()
IsAnySurvivorInStartArea()
IsFinale()
IsFinaleEscapeInProgress()
IsFinaleVehicleReady()
IsFirstMapInScenario()
IsPlayingIntro()
IsSessionStartMap()
GetTotalElapsedMissionTime()
IsFinaleWon()
GetMissionWipes()
IsLocationFoggedToSurvivors( vLocation )
GetTimeSinceSpecialZombieKilled( iClass )
GetClosestActivePipeBomb( origin )
RegisterForbiddenTarget( entity ) - Bots avoid damaging forbidden targets.
UnregisterForbiddenTarget( entity )

CTerrorPlayer
IsIT()
IsAdrenalineActive()
IsGettingUp()
IsImmobilized()
IsInCombat()
IsOnThirdStrike()
IsFiringWeapon()
IsStaggering()
IsDominatedBySpecialInfected()
GetSpecialInfectedDominatingMe()
GetAliveDuration() - Returns the time the character has been alive (only valid when alive).
HasEverBeenInjured( team ) - Returns true if the character has ever been injured by a member of the given team.

CBaseEntity
GetCenter() - Get world space center of object - absolute coordinates
TakeDamageEx( hInflictor, hAttacker, hWeapon, vecDamageForce, vecDamagePosition, flDamage, nDamageType )

CBaseCombatCharacter
GetLastKnownArea() - Return the last nav area occupied - NULL if unknown.

NavMesh
GetNavAreaByID( areaID )
GetLadderByID( ladderID )
GetNavArea( origin, flBeneath ) - given a position in the world, return the nav area that is closest to or below that height.
GetNearestNavArea( origin, maxDist, checkLOS, checkGround ) - given a position in the world, return the nearest nav area that is closest to or below that height.
GetNavAreasInRadius( origin, radius, table ) - fills a passed in table of nav areas within the radius.
FindNavAreaAlongRay( startpos, endpos, ignoreAreaID )
GetNavAreaCount() - return total number of nav areas.
GetAllAreas( table ) - fills a passed in table of all nav areas.
GetObstructingEntities( table ) - fills a passed in table of all obstructing entities.
GetAreasWithAttributes( bits, table ) - fills a passed in table of all nav areas that have the specified attribute bits.
NavAreaBuildPath( area, area, goalPos, flMaxPathLength, teamID, ignoreNavBlockers ) - returns true if a path exists.
NavAreaTravelDistance( area, area, flMaxPathLength ) - compute distance between two areas. Return -1 if can't reach 'endArea' from 'startArea'.
GetLadderCount()
GetAllLadders( table ) - fills a passed in table of all nav ladders.
FindLadderAlongRay( startpos, endpos, ignoreArea )
GetNavAreasFromBuildPath( table ) - Fills table with areas from a path. Returns whether a path was found.
GetNavAreasOverlappingEntityExtent( entity, table ) - fills passed in table with areas overlapping entity's extent.
RegisterAvoidanceObstacle( entity )
UnregisterAvoidanceObstacle( entity )

CNavLadder
GetLadderEntity()
GetID()
ConnectTo( area, dir )
Disconnect( area )
IsConnected( area, dir )
GetBottomOrigin()
GetTopOrigin()
GetBottomArea()
GetTopArea()
GetLength()
GetWidth()
GetDir() - Return the direction the ladder faces (ie: surface normal of climbable side).
GetPosAtHeight() - Return 2D coordinate of the ladder at a given height.
IsInUse() - Return true if someone is on this ladder (other than 'ignore').
IsUsableByTeam( team )

TerrorNavArea
GetID()
HasAttributes() - Nav area attribute bits
GetAttributes()
SetAttributes(
RemoveAttributes()
HasSpawnAttributes( attributes ) - Spawn attribute bits.
GetSpawnAttributes()
SetSpawnAttributes( attributes )
RemoveSpawnAttributes( attributes )
GetPlaceName()
SetPlaceName( name )

GetCenter()
GetCorner( cornerIndex ) - Get a corner position.
FindRandomSpot() - Get a random origin within the area extents.
GetSizeX() - Return the area size along the X axis.
GetSizeY() - Return the area size along the Y axis.
GetZ( pos ) - Return Z of area at (x,y) of 'pos'.
GetDistanceSquaredToPoint( pos ) - Return shortest distance between point and this area.
IsRoughlySquare() - Return true if this area is approximately square.
IsFlat() - Return true if this area is approximately flat.
IsDegenerate() - Return true if this area is badly formed.
IsVisible( point ) - Return true if area is visible from the given point.
IsUnderwater()
IsCoplanar( area ) - Return true if this area and given area are approximately co-planar.
IsEdge( dir ) - Return true if there are no bi-directional links on the given side.
Contains( area ) - Return true if other area is on or above this area, but no others.
ContainsOrigin( point ) - Return true if given point is on or above this area, but no others.
IsOverlapping( area ) - Return true if 'area' overlaps our 2D extents.
IsOverlappingOrigin( pos, tolerance ) - Return true if 'pos' is within 2D extents of area.

GetAdjacentCount( dir ) - Get the number of adjacent areas in the given direction.
GetAdjacentAreas( dir, table ) - Fills a passed in table with all adjacent areas in the given direction.
GetAdjacentArea( dir, n ) - Return the n'th adjacent area in the given direction.
GetRandomAdjacentArea( dir ) - Return a random adjacent area in the given direction.
IsConnected( area, dir )
ConnectTo( area, dir ) - Connect this area to given area in given direction.
Disconnect( area ) - Disconnect this area from given area.
GetIncomingConnections( dir, table ) - Fills a passed in table with areas connected TO this area by a ONE-WAY link (ie: we have no connection back to them).
AddIncomingConnection( area, dir ) - Add areas that connect TO this area by a ONE-WAY link.
RemoveOrthogonalConnections() - Removes all connections in directions to left and right of specified direction.
ComputeDirection( point ) - Return direction from this area to the given point.

GetParent() - Returns the area just prior to this one in the search path.
GetParentHow() - Returns how we get from parent to us.
GetLadders( table ) - Fills a passed in table of ladders in direction.
ConnectToLadder( ladder )
DisconnectLadder( ladder )
IsConnectedLadder( ladder, dir )
GetElevator() - Returns the elevator if in an elevator's path.
GetElevatorAreas( table ) - Fills a passed in table with a collection of areas reachable via elevator from this area.
GetDoor() - Returns the door entity above the area.

IsDamaging() - Return true if continuous damage (eg: fire) is in this area.
MarkAsDamaging( duration ) - Mark this area is damaging for the next 'duration' seconds.
IsBlocked( team ) - Return true if team is blocked in this area.
MarkAsBlocked( team ) - Mark this area as blocked for a team.
UnblockArea()
IsBottleneck()
IsCleared( player ) - Returns true if this area has been cleared for the player.
MarkAreaCleared( player ) - Mark this area as cleared for the player
MarkAreaNotCleared()
GetTimeSinceCleared()
IsValidForWanderingPopulation()
IsSpawningAllowed() - Returns true if spawning is allowed in this area.
IsPotentiallyVisibleToTeam( team ) - Return true if any portion of this area is visible to anyone on the given team.
IsCompletelyVisibleToTeam( team ) - Return true if given area is completely visible from somewhere in this area by someone on the team.
HasAvoidanceObstacle( maxheight ) - Returns true if there's a large, immobile object obstructing this area.
MarkObstacleToAvoid( height ) - Marks the obstructed status of the nav area.
GetAvoidanceObstacleHeight() - Returns the maximum height of the obstruction above the ground.
GetPlayerCount( team ) - Return number of players of given team currently within this area (team of zero means any/all).
DebugDrawFilled() - Draw area as a filled rectangle of the given color.

Defines
"LADDER_UP"
"LADDER_DOWN"
"NAV_NORTH"
"NAV_EAST"
"NAV_WEST"
"NAV_SOUTH"
...