Portal 2: Community Edition - March 18th, 2026 Update

Additions (17)

  • Added 360 video export to startmovie

  • Added a sound KV to env_spark to change the spark sound

  • Added ability to configure the filter used for floor buttons

  • Added Controller LED coloring by last shot portal (stolen from Portal 2)

  • Added ConVar cl_portal_use_old_fizzle_effects for using old Portal 1 style portal fizzle effects

  • Added -debug_dynamic_mounts to debug Steam dynamic mounts

  • Added enabled field to particle operators to toggle operator on/off

  • Added new customization option to show Conversion Gel on cubes. This is also available as an info_portal_gamerules keyvalue for mapmakers

  • Added OnFizzled output to prop_portal

  • Added OnPressedCube / OnPressedPlayer to floor buttons

  • Added player_weapons_removed & player_equipped game events

  • Added sv_force_upgrade_weighted_cube ConVar, to force the new models, allowing always seeing paint at the cost of backwards compatibility. This is intended for situations like default levels that are known not to check for specific models

  • Added texture flag to fully ignore mat_picmip (NOLOD only ignores mat_picmip when ConVar is positive) at 2^18

  • All paintable props now have OnPainted and OnUnpainted outputs

  • Floor buttons will now use the second hitbox set, if present to configure the trigger bounds

  • prop_monster_box now has gel overlays like regular cubes. It also has a new keyvalue to determine whether it should use the partially broken paint behaviour like in base Portal 2, or behave the same as regular cubes

  • prop_physics_paintable can specify which skins to swap to in order to use gel overlays

Fixes (25)

  • Allowed .dat files to be included in addons

  • Fixed a crash if entity filters are evaluated on dead entities

  • Fixed a crash in some cases when cubes are pulled out of the way of a laser

  • Fixed an issue where scenes inside scenes.image files would not be properly precached, which resulted in their associated audio files being unable to play

  • Fixed crash with ragdolls

  • Fixed crash with the netconsole

  • Fixed cvar_defaults.cfg not properly overriding ConVars marked with FCVAR_REPLICATED

  • Fixed host_map_mount_order_detection not prioritizing custom asset paths in some cases

  • Fixed issues with map name handling for trigger_changelevel and point_changelevel

  • Fixed local splitscreen

  • Fixed misspelled KV on snd_op_occlusion: occlusio_db_loss is now occlusion_db_loss (old KV still works though)

  • Fixed painted cubes not displaying adhesion gel skins

  • Fixed pellets produced by fire_energy_ball not hurting players

  • Fixed rare crash when using point_template under some circumstances

  • Fixed save screenshots containing garbage

  • Fixed saves not working properly on Linux, due to a file system bug

  • Fixed splitscreen mode not rendering correctly

  • Fixed sv_alternateticks being forced off on Linux. Apparently it's even doing this in Portal 2

  • Fixed sv_schrodinger_emit_sound

  • Fixed the game not responding to SIGINT

  • Fixed WebM video export

  • Make env_global's GetCounter input usable

  • Preserve bodygroups (frankenturret heads, etc) when fizzling objects

  • Properly clear env_global counters when initially created

  • VTF textures below v7.5 are no longer allowed to set v7.5-specific flags to guard against flags from TF2 being set

Improvements (18)

  • Cloth no longer simulates while the game is paused by default

  • cl_portal_use_new_dissolve and fx_new_sparks no longer require cheats to be enabled

  • Console input autocomplete suggestions now include fuzzy matches

  • Entity filters will no longer crash if chained in an infinite loop

  • env_spark entities can now override fx_new_sparks to use new or old sparks

  • Exposed the following debug ConVars: snd_occlusion_pos_override, snd_occlusion_material_override, snd_occlusion_visualize, snd_occlusion_visualize_filter, snd_occlusion_indirect_radius, snd_occlusion_indirect_min, snd_occlusion_indirect_max, snd_occlusion_collide_min_distance

  • fps_max_menu is now also respected while in game with opened menu

  • High Energy Pellets will now obey damage filters on the player

  • Lightboard KeyValues definitions file no longer needs to exist for the game to boot

  • Made sv_gravity affect cloth

  • Marked hud_fastswitch as archive

  • Marked r_portal_light_intensity as archived

  • Marked sv_portal_legacy_compat, sv_enableholdrotation, mv_uncrouch_on_jump, mv_duckjump, and mv_bhop ConVars as executable by maps

  • Move rumble to Steam input

  • Removed devonly flag from net_fakelag

  • Removed soundsystem.dll

  • Reworked how prop_weighted_cube functions. Every cube type has its own model, with identical skin layout. Cube type has been split into behavior and shape fields, allowing things like a spherical reflection cube. These new models dynamically tint, allowing showing all gel types as well as matching the configured colors

  • Schrödinger cubes now emit SchrodingerCube.Music for music

AngelScript (27)

  • util::TraceLine can now take array<CBaseEntity@> as ent to ignore

  • util::TraceLinePortal can now take array<CBaseEntity@> as ent to ignore

  • Added (cl|sv)_scriptsystem_dump_lsp commands to game

  • Added CBaseEntity::GetGroundEntity CBaseEntity::IsOnGround CBaseAnimating::IsOnFire

  • Added EHandle<> template type to AS

  • Added scriptsystem_dump (and _json/_lsp) variant commands to Hammer

  • Added access masks to angelscript bindings. This will prevent client/server functions from being called in the wrong places

  • Added bindings for AngleVectors

  • Added ConVar change callback support to scriptsystem

  • Added KV and output support for script classes

  • Added parameter names to a lot of AS functions/methods

  • Applied access masks to attributes. ServerCommand/ClientCommand are only available in their respective domains

  • Entities in AS can now be casted

  • Entity outputs now have Init and Get methods

  • Exposed CBaseEntity::KeyValues methods to AS

  • Exposed more base entity classes to AS (only a stub for now)

  • Fixed AngelScript malformed attribute error displaying 'Entity' attribute name instead of the real name in some cases

  • Fixed AS debugger not working

  • Fixed casting in AS

  • Fixed issue where CommandArgs@ in custom commands had to be non-const. It now requires const

  • Fixed Scriptsystem in Hammer not being able to load any scripts

  • Refactored script loading. Each search path will now load sv_init.as cl_init.as and init.as and define SERVER and CLIENT to differentiate where the modules are to be loaded

  • Scriptsystem debugger now works properly

  • Scriptsystem dumps now contain global funcdefs

  • Scriptsystem json dumps now use AS method names

  • Scriptsystem lsp dumps now doesn't duplicate methods from parent classes

  • Scriptsystem's string.toInt and string.toUInt can now convert numbers from any base

Graphics (21)

  • Added $emissiontransform to PBR, to apply transform to the emission texture specifically

  • Added nearz property to clustered light entities

  • Added sv_reloadmaterialsonmapload ConVar that controls material reload behavior when loading map, can improve map load times when disabled

  • Added DoSSAO function to viewpostprocess

  • Added light cookies to light_rt entities

  • Added various ConVars to control AO

  • Doubled cookie atlas size, allowing 4 times the texture data to be allocated before exhaustion

  • Fixed r_ssao breaking cubemap building

  • Fixed SetLightScale on clustered lights not changing the light intensity

  • Fixed cookied lights only displaying cookies when shadowed

  • Fixed crashes when using some material proxies on non-standard stuff

  • Fixed flashlight and env_projectedtexture shadows being 4x larger per-dimension than their pre-clustered equivalents

  • Fixed lightmappedgeneric ssbump detail textures not working properly

  • Fixed multi-frame texture cookies only ever displaying the first frame

  • Fixed SSAO crashing game in some cases

  • Fixed sun specular not blending with lightmaps properly on PBR textures

  • Increased default clustered shadow budget from 6 to 12

  • Light cookies now correctly use the light entity orientation

  • PBR materials with manually specified $envmap will no longer be overridden to use env_cubemap

  • Rate limited the clustered atlas allocator warning to 1 message per second

  • Replaced general clustered light modes with independent lighting component modes

Panorama (5)

  • Added SettingsEnumBitField Panorama control

  • Added WeaponEquipped and WeaponsDropped Panorama events

  • Fixed SettingsSlider invert not working correctly when the slider is set to display a percentage

  • Fixed crash with the video settings screen when an incorrect panel type is used for the setting dropdowns

  • Fixed Panorama rendertargets being invalidated when mat_picmip is changed

Tools (41)

  • devui_auto_scale will now use the smallest window dimension to calculate scale factor

  • Added "Paste Special Again" context menu option in Hammer, which will use the last saved Paste Special options in the session without a prompt

  • Added -EnvCubemapNotForcedForPBR parameter to VBSP, for mappers that need PBR materials with handmade envmaps

  • Added -help/-? to StudioMDL

  • Added -nowinerenderfix to disable rerendering Hammer views on each frame in Wine

  • Added a "Use Native File Browser" option in Hammer, to allow using Qt file dialogs and vice versa

  • Added an ImGui game events debugger

  • Added an in-game cloth/softbody debugger

  • Added an in-game ImGui material inspector/rudimentary editor

  • Added ConVar devui_auto_scale which, when enabled, automatically scales DevUI to match the reference resolution of 1920x1080, like Panorama

  • Added displays thickness of ropes and cables in Hammer

  • Added manual inputs to clustered light inspector

  • Added mdl2dmx, a very basic static prop decompiler

  • Added Near Z property slider to clustered light inspector

  • Added position/angle inputs to clustered light inspector

  • Added script module info DevUI panel

  • Added support for custom fonts in DevUI themes. FontScaleDpi, FontScaleMain, FontScaleBase control font size. Font property controls the actual font and is a path like resource/MyFont.ttf

  • Added support for Hammer++ rectangle map hotspot definitions

  • Added vtex config flag "ignorepicmip" to control setting the IGNORE_PICMIP flag in the compiled VTF

  • Allow bool/boolean to be interchangably for FGD IO and KV definitions

  • Displacement tools now edit continuously without needing to move mouse

  • Entity report dialog can now be sorted

  • Fixed devui_auto_scale not performing any scaling

  • Fixed devui_auto_scale turning text into a blurry mess below 1080p

  • Fixed a crash in Hammer when copy-pasting brushes

  • Fixed a crash when removing/changing loaded FGDs in Hammer

  • Fixed copy+paste in ImGui windows

  • Fixed ImGui looking blurry due to autoscaling

  • Fixed Paste Special entity name prefix field not retaining its value across multiple different invocations of the dialog

  • Fixed StudioMDL trying to run md on Linux to create the output dir. It now runs mkdir -p

  • Hammer now does not spam warning about unknown detail object types

  • Hammer prints more FGD errors when something goes wrong

  • Hammer's Discord Rich Presence no longer shares map name by default

  • Model browser getting sometimes getting stuck

  • Removed -winecompat from Hammer, fixes will be applied when Wine is detected automatically

  • Removed zlib and libxml2 dependencies from StudioMDL on Linux

  • Shift+F1 keybind will now toggle the DevUI menu instead of failing to open a nonexistent VGUI window

  • The -noao VRAD parameter now sets LVLFLAGS_DISABLE_BAKED_AO

  • Updated VRAD help text

  • VRAD AO is now DISABLED by default and can be enabled by passing -ao. XeGTAO should be preferred for VRAD baked AO

  • When using the eyedropper tool, Hammer will prompt to name entities if they did not have one already

VScript (8)

  • prop_weighted_cube now has GetCubeBehavior(), GetCubeShape(), GetLaser(), IsEmissionLocked(), IsPressingButton() and GetPaint() VScript functions. GetCubeType() was removed, use behavior/shape instead or a model check

  • Added CBasePortal::IsActive

  • Added vscript_script_max_exec_time to control max allowed script execution time. Use with caution

  • Fixed a crash in VScript when calling CreateEntityByName on a non-existing class

  • Fixed rare crash from VScript while converting some values to string

  • Fixed VScript crash related to saving tables that reference themselves

  • VScript TraceLineEx can now take an array of entities to ignore

  • VScript TracePortalLine can now take an array of entities to ignore