An update has been released for Left 4 Dead 2. [b]Bug Fixes[/b] - 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. [b]Features and Updates[/b] - 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]   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. [b]New Scripting Hooks[/b] [b]Global[/b] 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() [b]TheDirector[/b] 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 ) [b]CTerrorPlayer[/b] 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. [b]CBaseEntity[/b] GetCenter() - Get world space center of object - absolute coordinates TakeDamageEx( hInflictor, hAttacker, hWeapon, vecDamageForce, vecDamagePosition, flDamage, nDamageType ) [b]CBaseCombatCharacter[/b] GetLastKnownArea() - Return the last nav area occupied - NULL if unknown. [b]NavMesh[/b] 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 ) [b]CNavLadder[/b] 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 ) [b]TerrorNavArea[/b] 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. [b]Defines[/b] "LADDER_UP" "LADDER_DOWN" "NAV_NORTH" "NAV_EAST" "NAV_WEST" "NAV_SOUTH"