Portal 2: Community Edition - November 23rd, 2025 Update
Additions (22)
- Added a "client" time version for Sound Operators output_entry_elapsed and output_stop_elapsed which use game client time instead of host time
- Added a note to the top of a VMF file if it's saved with any Strata extensions
- Added command cl_particles_dump_json to dump particle operators to a file
- Added command mat_reloadtexture to reload a specific texture
- Added command steam_cloud_list
- Added commands sv_particles_reload/cl_particles_reload to reload particles
- Added ConVar cl_pause_on_steam_overlay for whether singleplayer game should pause when Steam Overlay is opened
- Added ConVar cl_portal_crosshair_auto_scale, which when set to 1 mimics Portal 1 and Portal: Revolution crosshair scaling
- Added ConVar save_check_for_mismatch. When true, the game will not load saves which were taken on old map versions and fires a save_map_version_mismatch event
- Added ConVar scene_preferloose to control whether the game should load loose VCDs or cached VCDs first
- Added ConVar sv_exactbasevelocity, which fixes basevelocity boosters giving entities an extra half tick worth of basevelocity
- Added ConVar sv_mainmenu_chapter_override
- Added ConVar sv_player_use_radius to control player use radius
- Added ConVar sv_portal_sp_door_crush (off by default) which lets players be crushed by prop_testchamber_door in single player
- Added ConVar sv_teleport_snaps_velocity, which makes trigger_teleport entities with "UseLandmarkAngles 1" rotate the teleported entity's horizontal velocity to match the destination angles in addition to rotating the entity's angles
- Added ConVars save_hud_autosave and save_hud. These are utility ConVars to manage UI state
- Added ConVars save_screenshot_res_x, save_screenshot_res_y, save_screenshot_res_aspect and save_screenshot_res_fov. Settings for game save screenshots
- Added game events portal_placed and portal_fizzled
- Added game events save_begin, save_map_version_mismatch, and map_load_failed
- Added startup parameter -bordered which will force the game to start with window border
- Allow directly adding ZIP files as search paths
- Restored the stats command
Fixes (32)
- Added workaround for SDL2/X11 bugginess with exclusive fullscreen windows
- This makes "Fullscreen" and "Fullscreen Window" display modes identical unless -allowexclusivefs is passed
Clamped fov_viewmodel value within 1-179cl_showpos now shows horizontal and vertical velocity instead of just horizontalConVar cl_fov is now archived in the configConVars cl_pitchup and cl_pitchdown are now clamped at 89 to prevent weird look behavior on controllersDamage inflicted by door crush is now attributed to the door instead of the worldFixed a crash on exit when two instances of the game are openFixed a crash on transitioning from d1_trainstation_04 to d1_trainstation_05 from the new HL2 anniversary updateFixed choreo scenes non functioningFixed commentary node subtitles sometimes not showing because the WAV file isn't precachedFixed commentary nodes having choppy animationsFixed crash if missing VOX-related filesFixed crashes when using mat_crosshair commands from main menuFixed crosshair dots not scaling with crosshair scaleFixed cursor remaining hidden on the main menu after launching the game (Linux bug)Fixed dedicated servers failing to open a socketFixed find file operations being broken on Linux in some casesFixed fps_max 0 ignoring fps_max_menuFixed full screen resolution scaling on LinuxFixed jittery input with m_rawinput 1/2 on LinuxFixed listen servers rejecting connections with the reason of being full, even if not fullFixed loading games that lack a specified MOD searchpath in their gameinfo.txtFixed paint blobs crashing game in rare casesFixed possible crash when loading corrupted BSP fileFixed possible crash when tempents are usedFixed rare crash that could happen on startupFixed some incompatibility with thirdparty softwareFixed some output spew being invisible in the consoleFixed Windows booting into exclusive fullscreen on first bootLoad basemodui translation filesMade SDL code respect -displayUnchecked player dissolveImprovements (15)
- Changed ConVar volume default to 0.5
- chaos.exe has been renamed to respective games
- Improved collision logic around some brush edges
- Improved performance of client side entity classname comparisons
- Improved performance of debug overlay texts like ent_text
- Increased fov_desired bounds to 1-179 from 75-90
- Made low OS memory warning print a little bit less often
- Made surfaceproperties_manifest.txt, game_sounds_manifest.txt, hudanimations_manifest.txt come from the MOD search path instead of GAME
- Mods now don't share configs
- Moved configs that were under platform/config to <default_write_path>/cfg
- Pulled in changes from Squirrel 2.2.5 for improved VScript stability/performance
- Removed check in sv_allow_mobile_portals to only apply cheats on sp_a2_bts5. ConVar is now marked as cheat always but maps are allowed to control it
- The ConVar engine_no_focus_sleep is now saved in configs
- Updated ConVar save_screenshot. A value of 2 will now also create a save screenshot when an autosave is made
- Updated pango, cairo, freetype2, fontconfig to their latest versions
Hammer (47)
- Added a helper that better visualises linked_portal_door
- Added a Scene Browser to Hammer for previewing VCD sounds and animations
- Added commands hammer_act and hammer_dialog_show
- Added initial hotspot implementation to Hammer (thanks Baguettery!)
- Added parameter %ToolViewportTexture that can be applied to any material to show a different material in the Hammer 3D viewport on brush surfaces
- Added Particle Browser button to Hammer Tools tab
- Added rotation cloning to the selection tool by holding shift (disabling rotational snapping can still be done by holding alt)
- Added rotation pivot point to the selection tool
- Added support for scaling prop_static and prop_dynamic right from the 2D viewport
- Added support for uniform scaling in the 2D viewport if resizing while holding control
- Added 'total elapsed time' to Hammer compile window
- Default Hammer render distance for models and details has been increased from 400 to 20,000
- Entities in Hammer will no longer erroneously scale with the 'scale' keyvalue
- FGD flag values can now have description (currently not visible in any UI)
- Fix Hammer crash when setting tinted overlay color back to white
- Fixed a crash when reading malformed textures
- Fixed a number of minor Hammer crashes for the Entity Properties window
- Fixed crash when using Scene browser in Hammer
- Fixed crash with the catapult helper in Hammer when you delete KVs on a catapult entity
- Fixed discord state in Hammer not updating immediately after changing settings
- Fixed Entity Help dialog having unreadable black text on dark mode
- Fixed Entity Help dialog not rendering text within angled brackets
- Fixed Hammer erroring out if Steam mounting is unavailable, even if the selected game doesn't need it
- Fixed Hammer regression causing objects to be duplicated
- Fixed Hammer scaled prop_static 2D bounding box not rotating correctly
- Fixed Hammer storing empty path for last opened map directory when closing the map browser without selecting a file
- Fixed Hammer transformation dialog not scaling prop_static or prop_dynamic correctly
- Fixed line helpers not hiding when disabling show helpers
- Fixed Open Map dialog not defaulting to the configured map directory sometimes
- Fixed Particle Browser crashing when previewing certain new TF2 particle effects
- Fixed rndwave and other soundscript features not working in Hammer Sound Browser
- Fixed Sound Browser and Soundscape Browser not saving and restoring settings properly
- Fixed Sound Browser Open Source button not working sometimes
- Fixed Sound Browser text fields not letting users copy their value
- Fixed Soundscape Browser filtering not selecting the right item
- Hammer's menu option "Load Pointfile" has been renamed to "Load Pointfile (Find Leak)"
- Implemented rotation and alternate group hotspot rect flags in Hammer
- Improved compile tools behavior in situations when you're mapping with Hammer in Wine and running the game natively on Linux
- Improved high DPI scaling in Hammer to work better on 4K displays with resolution scaling
- Improved spacing on entity report dialog
- Improved visual clarity of PBR in Hammer's shaded textured polygons mode
- In Hammer's texture replace dialog 'Everything' is now checked by default to bring parity with stock Hammer
- PBR materials should nolonger be overexposed in Hammer
- Sort the default point entity and solid entity option dropdowns in Hammer alphabetically
- Texture browser properly restores active texture group
- The scrollbars on 2D viewports in Hammer are now disabled by default
- Updated sound browser UI to use space more efficiently
Tools (23)
- Added mat_texture_list DevUI panel to quickly view the list of used materials on a map
- Added experimental VRAD optimization mode -culllights
- Added soundscriptui for debugging sound scripts
- Added particle ops and sound ops modes to docdump
- Added -report console parameter to VBSP VRAD and VVIS to output compile time reports as keyvalue files
- ATI1N and ATI2N formats will now use their correct names in debug windows like mat_texture_list
- Display warning when using the obsolete -LDR, -HDR, or -both compile options with VRAD
- Fixed a crash in Faceposer during startup
- Fixed a crash in HLMV when accessing an invalid model
- Fixed crash in VGUI material browser (used in the particle editor and material editor) when viewing certain materials
- Fixed Faceposer crash when loading an invalid subscene
- Fixed issue where surfaceproperties would fail to parse in VBSP
- Fixed non uniformly scaled static props getting bad normals in VRAD
- Fixed paths being lowercased in VBSP/VRAD/VVIS
- Fixed rare VRAD crash related to static prop bounce lighting
- Fixed relative -game paths breaking VBSP/VRAD/VVIS
- Fixed VMT patch files error when compiling a map if missing an include or replace KV pair
- Fixed VRAD baking lightmaps for all light modes
- Improved compiler logging for VMT patch file errors
- Improved mdlinfo output and usability
- Moved all HLMV and Faceposer settings to be stored on disk instead of in the registry
- Revamped mdlinfo to output more data in KV format
- StudioMDL properly caches models when loading
Panorama (26)
- Added initial iteration of Panorama world panels
- Added API GameInterfaceAPI.GetMaps()
- Added API GameSaves.CreateSaveGame()
- Added API GameSaves.GetGameSaves()
- Added API GameSaves.IsAutosaveInProgress()
- Added API GameSaves.IsSaveInProgress()
- Added $.BBCodeToHTML helper function
- Added event OnAutoSaveBegin
- Added event OnAutoSaveDangerousBegin
- Added event OnSaveBegin
- Added event OnSaveMapVersionMismatch
- Added OnMenu1 and OnMenu2 Panorama events, which get called for controller X and Y buttons when the menu is open
- Added underline <u>, strikethrough <s>, and heading 3 <h3> tags
- Exposed frametime and defaultframe properties on the AnimatedImageStrip panel to JavaScript
- Fixed a crash related to Panorama failing to read files asynchronously
- Fixed applying bold styling to <strong> element in Panorama
- Fixed bugs with pose parameters, flexes and sequences in the Panorama model panel
- Fixed dropdown menus sometimes eating inputs while closed
- Fixed issue where models in the Panorama model panel can be yeeted away by LookAtModel() calls
- Fixed debugger exiting the entire game when closed with the (X) button
- Fixed JavaScript modules sometimes erroring on instantiation
- Fixed model panel lights being a bit too weak
- Fixed sounds playing from map origin
- Made panorama_blur_ecomode functional and applied to every panel
- The game now loads the following paths for localizations:
- panorama/localization/%modname%_%lang%.txt
- panorama/localization/panorama_%lang%.txt
VideoSettings will no longer require an element with id DynamicTonemapping to existAngelScript (17)
- Added the following CBaseCombatWeapon virtual methods. These can be overridden
- Reload
- ItemPreFrame
- ItemPostFrame
- ItemBusyFrame
Added util::Remove(CBaseEntity) and CBaseEntity.Remove()Added util::TraceLine, util::TraceHull, util::TracePortalLine, util::GetEntityByIndex, util::GetMaxEntities, util::RemoveAdded CGlobalEntityList, accessed by gEntList. Methods:FindByClassnameFindByNameFindInSphereNextFirstFindByTargetFindByModelBindByNameNearestFindByNameWithinFindByClassnameNearestFindByClassnameWithinAdded bindings for CLight:GetInnerAngleGetOuterAngleGetColorHDRGetColorGetClusteredRadiusGetColorScaleGetColorScaleHDRSetColorSetColorHDRGetRadiusOverrideSetRadiusOverrideToggleTurnOffTurnOnSetShadowSizeGetShadowSizeGetPatternSetPatternSetOuterAngleGetOuterAngleGetStateSetLightFalloffCLQSetLightFalloffD50D0GetLightFalloffCLQGetLightFalloffD50D0IsHDRAdded bindings for IPhysicsObject (too many to list)Added bindings for ConVarRefAdded bindings to fire game events (global::GameEventManager)Added numerous method bindings to CBaseAnimating to make it match the VScript API (too many to list)Fixed crash on exitFixed dangling handles to existing scripts that registered eventsAdded the following bindings for CBaseEntity:GetDebugNameGetClassnameGetEntityIndexGetEntityNameGetKeyValueGetModelNameGetElasticitySetElasticityIsFloatingIsBSPModelGetFrictionSetFrictionSetGravityGetGravityPrecacheScriptSoundHasPhysicsObjectGetPhysicsObjectAdded commands sv_scriptsystem_dump_json and cl_scriptsystem_dump_json for dumping AngelScript API documentation to a JSON fileRenamed global::GameEventManager -> gGameEventManagerRenamed UTIL_TraceLine -> util::TraceLine, UTIL_Remove -> util::RemoveRenamed namespace Utility to utilVScript (9)
- Added ConVar vscript_collect_garbage to enable the Squirrel GC and disabled it by default for performance reasons (reverts a previous change from 2022 that enabled the GC)
- Added bindings for paint gun
- Function SendToConsole is now available on the client too
- Added function CSceneManager::IsSceneRunning()
- Renamed SetValue -> SetString in persistent storage API
- Added bindings for CBaseAnimating:
- FindBodygroupByName
- GetSkin
- SetSkin
Added bindings for CPropWeightedCube: GetCubeType (as well as corresponding enum values)Added the following methods to CLight:SetLightColorSetOuterAngleSetInnerAngleSetLightFalloffCLQGetOuterAngleGetInnerAngleSetShadowSizeGetShadowSizeTurnOffTurnOnToggleSetPatternSetLightFalloffD50D0SetClusteredRadiusOverrideGetClusteredRadiusOverrideGetStateAdded the following methods to CBaseEntity:TeleportIsFloatingGetKeyValueIntGetKeyValueFloatGetKeyValueBoolGetKeyValueStringGetElasticitySetElasticityEntities (34)
- Added "Use Global Config" and "Global Config: Sign ID" properties to prop_testchamber_sign which lets modders read chamber sign information from a config file. Allows for multiple signs per map
- Added SetPushSpeed input to trigger_push
- Added a "Strict Mode" entity setting to trigger_setspeed which helps maximize boost consistency
- Added attachments laser_attachment and laser_glow_attachment for reflection and Schrödinger cubes
- Added entity func_touch, a solid entity with the same outputs and configuration as trigger_multiple
- Added input ExplodeBomb to prop_paint_bomb
- Added input LockEmitState to laser/Schrödinger cubes to lock the current laser state
- Added inputs to logic_playerproxy
- LowerWeapon
- ReadyWeapon
Added inputs to npc_portal_turret_floorEnableMotionDisableMotionAdded inputs to vgui_neurotoxin_countdownPauseResumeSetTimeAdded properties to weapon_portalgunmodelviewmodelCustomPortalColorsPortal1ColorPortal2ColorAdded the following inputs to the light entities:SetLightColorSetLightScaleSetLightFalloffSetInnerAngleSetOuterAngleAdded tint color property to info_overlay, which allows mappers to change the color of overlaysCombine and metrocops now correctly use their VOX sentencesDissolve-related keyvalues and inputs now work on all entities derived from CBaseAnimatingFixed env_ambient_light lighting changes being carried over when switching mapsFixed env_global not firing the Counter outputFixed env_projectedtexture crashing when failing to load a movieFixed bug on laser/Schrödinger cubes with EmitLaser causing laser state to become permanentFixed citizens not having the correct voice linesFixed crash when hunters attempted to attack NPCs without being in a squadFixed crash when picking up personality cores, while a cool feature is enabledFixed input SilentDissolve being disabled by defaultFixed portal gun unable to fire through angled fizzler AABBFixed redirected lasers looking laggyFixed some dynamic prop entities potentially transitioning to the next map when they're not supposed toFizzlers will now turn on/off visually when sent their Toggle inputImproved projected texture limit by implementing a queue. The first projected texture to be activated is the first one to be disabled when the limit is exceededAdded ConVar debug_flashlight_limit which, when enabled, prints information about the projected texture queue every time a projected texture gets enabled or disabledLaser catchers will no longer reset their skin when loading a save while poweredPortals shot from a weapon_portalgun now properly link to the player's portalsReworked the "Velocity Mode" options on Strata's version of trigger_teleportReworked the settings of the trigger_setspeed entity to be easier to useSimplified the backwards compatibility settings on Strata's version of trigger_teleportGraphics (55)
- Added clustered renderer
- Default r_paintblob_otherviews_highres to 1
- Fixed testing element dynamic lights being too bright
- Added a console warning for when the clustered shadow/cookie atlases are full
- Added a flag to light_rt and light_rt_spot to force shadows to update every frame
- Added launch parameter -shadowatlassize to specify clustered shadow atlas dimensions. Must be power of two
- Added new $alphadither option to PBR shader. When set, dithering will be used instead of blending for transparency
- Added support for $treesway to PBR. The material parameters match VertexLitGeneric
- Added ConVar cl_player_render_in_reflective_glass
- Changed behaviour of $blendtintbymraoalpha to apply tint when alpha is 1 rather than 0
- Note that this may break any PBR materials that used $blendtintbymraoalpha
Detail objects should now renderFixed r_portal_light_intensity being too high by defaultFixed a crash on maps with lights resulting in negative radii calculationsFixed brightness of beam haloFixed crash that could occur when reflective/refractive glass was being renderedFixed crash when drawing 3D skybox in water reflection through portalsFixed crash when setting dof quality ConVar too highFixed crash when trying to use VolumeClouds shaderFixed crash with AnimatedOffsetTexture material proxyFixed CSM always being disabled on waterFixed CSM not working on worldFixed flashlight being weird after clustered light model changesFixed flashlights suddenly becoming invisible far from their originFixed fully dynamic named lights having lightstyles allocated for themFixed game crashing when loading map with missing materials and mat_error_texture_advanced enabledFixed incorrect light falloffFixed issue where toggling dynamic lights can toggle light style 0Fixed light cone and axis visualizers being inaccurate in the clustered light inspectorFixed light reflection artifacting in the PBR shaderFixed light specular/diffuse being incorrect on certain types of waterFixed LightmappedGeneric being incorrectly tinted when using $addbumpmapsFixed lights becoming fully shadowed outside their NearZ/FarZ rangeFixed models with transparent meshes being rendered incorrectly when using fast-pathFixed overlays not being fully lit on mat_fullbright 1Fixed potential bug with detail texcoord transforms in VLG when $treesway is enabledIf you notice broken VLG treesway models, please tell us!!Fixed projected textures not rendering properly on surfaces with $alphatest 1, like gratesFixed realtime light 0% distance/50% distance brightness being incorrectFixed some refract textures being too darkFixed static lights being networked (and rendered) on clientFixed static props compiled with Strata compilers showing black on mat_fullbright 1Fixed viewmodels being forced to draw when using AlternativeSorting on an entityFixed water rendering with png command for resolutions <16384x16384Force disable $depthblend on spritecard materials when -tools is enabledThis is a workaround for them not rendering in the particle editorFully removed $flat from UnlitGeneric. It didn't do anything before either but now it's totally goneImplemented HDR cubemap seam/edge blendingImproved clustered lighting performance on some GPUs and maps with many lightsPBR shader will not mask off base alpha when $blendtintbymraoalpha is used (matching VLG behavior)Removed system for swapping out models based on GPU level (legacy PC code)Stencil not being reset after mesh draw in DX11 shaderStrata Source now defaults to High settings for all users on first bootWater draws properly when taking 360 screenshots$lod replacemodel works as expectedmat_error_texture_advanced now also replaces materials with missing textures360 screenshots have postprocess enabled360 screenshots now align with viewing directionVTF (7)
- Don't fail to load a VTF if an unused resource cannot be read
- Ensure VTF compression resource is always loaded
- Fixed compressed VTFs (v7.6) failing to load when mat_picmip was 1 or higher
- Fixed Zstandard-compressed VTFs failing to load if a mip level has a zero-size width or height
- Improved quality of compressed textures generated by vtex
- Load pre-v7.5 VTFs formatted with ATI1N/ATI2N with the correct format
- VTF hotspot data resource ID changed to match new specification
Workshop (14)
- Added -workshopid parameter to workshopgui and workshopcli
- Added mounted_by_default key to addon config to not mount addon when first discovered
- Added documentation link to Workshop GUI help tab
- Added launch argument -noworkshop. The launch argument -safemode now also implies -noworkshop
- Added option to disable updating addon details from Steam to Workshop GUI options tab
- Added reload button to Workshop GUI file tab
- Allow loading ZIP file addons
- Allow some more Source engine file types in addon uploader
- Fixed map command autocomplete not updating after addons are enabled/disabled
- Fixed addon list not saving sometimes
- Fixed the Addon List DevUI window
- Fixed Workshop GUI not always correctly loading or saving some fields
- Fixed workshop uploader failing when certain keys are empty string
- Videos can now be loaded from vpks and bsps
Command System (9)
- Added a system to allow entities and scripts to always run certain commands regardless of sv_cheats
- Added a system to block entities and scripts from running certain dangerous commands
- Added ConVar cl_require_servercanexecute_in_sp and defaulted it to 1. This will block maps from running potentially malicious commands while in singleplayer
- Added ConVar sv_allow_unsafe_map_commands for backwards compatibility with older maps running blocked commands
- Blocked entities and scripts from running any commands marked as admin only
- Fixed admin only commands not always filtering correctly
- Fixed admin only commands not working while not in a map
- Fixed regression preventing ConVars from being set prior to a server becoming active
- Marked the following ConCommands and ConVars to always be allowed to be run and set by entities, scripts, and maps (FCVAR_MAP_CAN_EXECUTE)
- change_portalgun_linkage_id
- ent_teleport
- ent_orient
- cc_emit
- scene_playvcd
- sv_regeneration_wait_time
- startneurotoxins
- give_boots
- remove_boots
- can_carry_both_guns
- give_portalgun
- give_portalgun_orange
- upgrade_portalgun
- upgrade_potatogun
- sv_player_collide_with_laser
- give_paintgun
- upgrade_paintgun
- give
- setmodel
- sv_gravity
- player_throwforce
- player_throwenable
Game (6)
- Added a whole new Main Menu UI!
- Updated mat_bloomscale's default value to match Portal 2.
- Fixed broken dust particles in sp_a1_wakeup and sp_a2_core.
- Fixed missing prop_energy_ball sound effects and materials.
- Fixed error model appearing inside prop_energy_ball entities when inside a portal.
- Fixed minor visual errors on portal emitter props. (Special thanks to lenship2!)
Local Addons (10)
This update includes a new local addons system. Local addons allow us to implement small, toggleable adjustments to various aspects of the game, without directly editing the engine's code. If you have made an addon in the past or are interested in producing local addons for P2:CE, see here for submission guidelines / info: https://github.com/StrataSource/p2ce-addons
A list of local addons which have already been added can be found below:
- Added "Portal 1 Portal Gun" local addon.
- This replaces the portal gun's viewmodel, particles and SFX with Portal 1's, and changes the particles and sfx for portals. (Special thanks to Electrodynamite12 for providing updated particles!)
Added "Personality Sphere Visual Updates" local addon.This provides general improvements for personality spheres and related models.Added "Old Schrödinger Cubes" local addon.This replaces the Schrödinger cube model with a version from earlier in development.Added "Refractive Fizzlers" local addon.This adds a refractive visual effect to all fizzler types.Added "Unused Turret VO" local addon.This reimplements any unused Turret voicelines found within Portal 2's files, and adds script logic to restore lines designed to play if Turrets become blocked by a Hard Light Bridge.Added "Updated Media" local addon.Provides a method of toggling the changes made to menu backgrounds, loading screens and the post-credits cutscene.Added "Player Blood" local addon.This re-enables player blood, as seen in Portal 1.Added "Adhesion/Reflection Gel Assets" local addon.This implements Adhesion/Reflection gel-related assets. (Special thanks to lenship2 for creating this local addon!)Added "Dynamic Light Bridge Lights" local addon.This makes Hard Light Bridges cast light on the surroundings, as seen in our "Clustered Graphics Showcase".. Warning, can be very expensive on lower-end hardware!