Left 4 Dead 2 has received a surprise update on Steam.

The horror survival game, released back in 2009, has had few updates to talk about in recent years.

But, back in late 2020 received 'The Last Stand' expansion - a collaboration between the Left 4 Dead community and Valve.

This new update comes as a welcome surprise - here's what's new.

15th June 2021 Patch Notes

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


  • 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()


  • 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 )


  • 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.


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


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


  • 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 )


  • 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 )


  • 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.


  • "NAV_EAST"
  • "NAV_WEST"

Follow us for the latest updates!



Enter your email and receive 10% off your first order.