Changelog
Version 2.7.0
Add
srctools.sndscape, for parsing soundscape scripts.Changed
PackList.load_choreo_scenes()to warn ifscenes.imageis not found.Change type for FGD keyvalue options to
KVOption. Previous tuple attributes are deprecated.Add support for
orientedwidthheight(),orientedwidthheighthalf(),orientedboundingbox()andclusteredlight()Strata FGD helpers.Add support for descriptions in spawnflags - displayed in Strata Source.
Add
noinherit()FGD helper, for indicating values to avoid inheriting from base classes.Add option to control double-quote escaping behaviour for FGDs, seperately to custom syntax.
Add support for parsing Strata’s Keyvalues-based
cmdseqvariant.Allow customising the filename used for injected
PackListfiles.Add support for parsing Strata’s ‘colorvars’ system.
Add support for parsing Strata’s v2 and v3 tintable overlays BSP format.
Rearrange
srctools.bsp.Overlayattributes, parse basis U/V out of the 4 handle positions.Issue #43: Fix incorrect export of displacement
triangle_tagvalues.Issue #44: Fix
VTF.read()not initalisinghotspot_infoandhotspot_flags.Account for VBSP++’s
--cullvertsparameter, which discards the original faces lump.
Version 2.6.2
Fix unknown bits sometimes not round tripping through enum bitfields.
Fix incorrect parsing of the deprecated
bbox()FGD helper.Add support for saving/loading VTF hotspot data.
Don’t backslash-escape single quote characters.
Consult the various app IDs when looking for folders for searchpaths.
Deprecate
UVAxis.rotate().
Version 2.6.1
Add
srctools.math.PointsMap, which fuzzily matches vector keys.Add
Geometry.from_points(), creating a brush from a point cloud.Add support for exporting the old FGD ‘report’ syntax (
name(*type)).Fix
srctools.math.quickhull()not functioning, allow any vector as input.Suppress the custom FGD editor-only flag if custom syntax is disabled.
Support various shader parameters added by Strata Source.
Properly implement detail prop packing logic, only pack sprites/models that are used by the BSP.
Add
srctools.types, which contains common types and classes.Switch type hints for all functions taking files to more precise protocols.
Add source tracking for packed files, allows logging the cause for each file.
Don’t resave package/soundscript caches for packlists if not modified.
Fix issue with locating Steam folders on non-Windows platforms.
Version 2.6.0
- Rewrite FGD ‘helper’ parsing to more closely match the actual parser.
Spaces between arguments, not the commas are used to separate them. For most helpers commas are meaningless.
Make it clear that
srctools.fgd.UnknownHelpershould not be relied on - expect proper implementation to be added in future versions.RGB colours now are
0-255integers, not floats.Helpers now all support tags, except for some extension helpers.
Deprecate
bbox()helper, this doesn’t actually exist.Backward-incompatible change - renamed
HelperExtAppliesTo.tagto.applies.
Add
srctools.geometry, which implements clipping and carving brushes.Add extension
editor(-only) flag to FGD keyvalue definitions.Issue #38: Preserve entity/node/brush/etc IDs when parsing VMFs and BSP entities.
Treat
oggfiles as valid sounds in various places.Consistently raise
TypeErrorif invalid types are sent to aTokenizer.Properly add
base_plat_trainclass resource function and fixitem_teamflag.BEE Issue #4299: Fix sprites and decals not being detected properly for packing.
Added
periodic_callbackoption toTokenizer, and allow that to be passed throughKeyvalues.parse()andFileSystem.read_kv1().Fix
BSP.static_prop_models()breaking if props were already parsed.Make toplevel aliases like
srctools.VPKlazy import.Add support for detecting sounds out of choreo scenes when packing.
Version 2.5.0
Drop support for Python 3.8.
Switch to Meson for building the package.
Issue #35: Only use character escapes in FGD custom syntax mode. The original parser only allows
\n.Add
Token.PAREN_OPEN/PAREN_CLOSE, enabled byTokenizer.string_parens.Avoid escaping
/and?, these are unambiguous. BSPs also allow\nin values again.Add
multilineparameter toescape_text(), to allow preserving\n.Support exporting FGDs with unevaulated string bases.
Add suppport for reading non-directory VPK files, where contents are all in one file.
FGDs may optionally permit unknown value types to be parsed/exported in string form.
Fix some options being incorrectly handled in Strata game mounts definitions.
Allow entities to delete multiple keyvalues at once.
Add support for
|appid_XXX|syntax ingameinfo.txtfiles.Fix silent buttons trying to pack invalid
Buttons.snd0soundscripts.Handle entities being added/removed during iteration of
VMF.search().Share common strings in the engine database to save some space.
Fix saving the
PHYSCOLLIDEBSP lump.In log files, increase size limits for
ExceptionGrouptracebacks.Add
srctools.sndscript.SoundChars, allowing easier parsing of sound characters.Add
srctools.dmx.Element.get_wrap(), allowing handling defaults more conveniently.Make
EntityDef.kv,.inpand.outviews settable, improve behaviour.
Version 2.4.1
Add
srctools.steam, written by @Thenderek0. This allows locating Steam games based on their app ID. Support was also added for parsing Strata mount definitions in gameinfo.txt.Add
header_onlyoption forVTF.read(), allowing reading only metadata if the image is not required.Fix casing not being preserved for names of FGD keyvalues during parsing.
Fix
PackList.write_soundscript_manifest(),write_particles_manifest()andwrite_manifest()trying to write to a closed file.Handle string/int/float subclasses being assigned to VMF keys.
Add
single_blockargument toKeyvalues.parse(), allowing parsing blocks in the middle of a document.Allow disabling the “spawnflag labelling” FGD feature.
srctools.loggerlog files will now always be written as UTF-8.Add a
custom_syntaxoption toFGD.export(), disabling export of custom syntax. Resources can now be exported.Correctly produce an error if a FGD entity definition is missing its closing bracket.
Escape all characters utlbuffer.cpp does -
\n,\t,\v,\b,\r,\f,\a,\,?,',".Unconditionally enable support for escaping characters in DMX Keyvalues2, since Valve’s parser can handle it. Binary formats never needed escaping.
Correctly look up types for conditional shader parameters (
ldr?$bumpmap).Parse FGDs correctly which have multiline strings with the plus on the second line.
Version 2.4.0
Added
srctools.choreo, for parsing choreographed scenes.Allow passing
FrozenVectoVMF.make_prism()/make_hollow().Fix bare strings on the end of CRLF lines eating the
\r.Escape characters like
"when exporting VMFs and BSPs. This isn’t supported by regular Source, but can be added by other branches.Added
Keyvalues.line_num, to allow reporting the source location in exceptions.Keyvalues.export()is now deprecated, useserialise()instead.Allow passing VMF settings via keyword arguments - the
map_infodictionary parameter is now deprecated.Allow directly passing enums to set VMF keyvalues and fixups, if the
valueis itself a valid value.Parse Strata Source’s other VMF additions - viewport configuration, brush face vertices and instance visibility.
Add
Tokenizer.plus_operator, allowing+to be parsed as an operator for FGDs but still be valid inside bare strings elsewhere. These are common ingameinfo.txt.Add
Solid.is_cordonto replacecordon_solid, better representing its boolean nature.Issue #29: Fix
0x03characters causing an early EOF in the tokeniser.Preserve passed in key casing in
find_key()/find_block()’s return values.
Version 2.3.17
Added
Keyvalues.serialise(), a replacement forexport().Fix
+and=being parsed as part of a bare string if not the first character.Fix keyvalue-type snippets causing a parse error for code coming after them.
Include filename/line number in missing snippet errors.
Version 2.3.16
Fix entity keyvalues being lowercased when parsed from files.
Add “snippets” to FGD parsing, allowing reuse of descriptions and other small pieces of data.
Allow VMTs to use
/* */comments.Issue #24: Fix incorrect
matrix.inverse()being calculated. PR by @Ozxybox.Allow omitting file/line number parameters for TokenSyntaxError.
Allow passing
PrismFacetoVMF.add_brush().Parse Strata Source’s VMF displacement data.
Remove negative zeros when formatting vector and angle values.
Expand
Angle/Matrix.from_basis()to pick the orientation if less than 2 vectors are provided.Add
vmf.Side.from_normal(), which generates a VMF face pointing in an arbitary direction.Add
vmf.Solid.point_inside(), which checks if a point is inside or outside a brush.
Version 2.3.15
HammerAddons Issue #237: Ensure FGD model helpers will override each other.
Issue #20: Fix VTF.compute_mipmaps() not working for cubemaps.
Correctly handle
.vvd/.vtxetc files if packed asMODEL.Improve performance of pure-Python VTF save/loading code.
Add
Vec.clamped(), for applying min/max bounds to a vector.Fix
Entity.make_unique()renaming entities with numeric suffixes which were already unique.
Version 2.3.14
Drop support for Python 3.7.
Fix VMT parsing not braces on the same line as the block name, like
Proxies {.Add Cythonised versions of
conv_int(),conv_float()andconv_bool().Added a
repr()forsrctools.vmf.Entity.Automatically clean up up empty sets when removing entities from
VMF.by_classand.by_target.Fixed saving/loading issues with a number of VTF formats.
Version 2.3.13
Renamed
NO_FLASHLIGHTinbsp.StaticPropFlagstoNO_SHADOW_DEPTHto reflect the actual behaviour of the flag, added the realNO_FLASHLIGHTdefine.Add
Tokenizer.preserve_comments, which producesCOMMENTtokens instead of discarding them.Issue #18: Fix incorrect module/function names in logging messages (via @ENDERZOMBI102).
Fix
srctools.vmt.Material.apply_patches()not applying material proxies from the parent.Use
surrogateescapewhen encoding/decoding BSP data, to allow values to round-trip.
Version 2.3.12
Handle the special
$gender“variable” in WAV filenames.Add
prop_door_rotatingclass resource function.Remove
weapon_scriptclass resource function, instead use a direct resource in the FGD.Use
typing_extensions.deprecated()to mark functions and methods which should not be used.
Version 2.3.11
Include the docs and tests in the source distribution.
Add support for detecting and packing weapon scripts.
Make custom model gibs inherit skinset when packing.
Add
srctools.bsp.BModel.clear_physics(), to delete physics data for a brush model.Add
srctools.keyvalues.LeafKeyvalueError, raised when block-only operations are attempted on leaf keyvalues. This improves the messages raised and makes them consistent.Fix
srctools.vtf.Frameindexing behaviour. It would access totally incorrect pixels.Correctly read/write L4D2’s BSP format.
Version 2.3.10
Fix
srctools.vtf.Frame.copy_from()not clearing cached unparsed file data. If the VTF was parsed from a file, this could case changes to be overwritten with the original data.Add
srctools.vtf.Frame.fill(), for filling a frame with a constant colour.PR #17: Add support for Strata’s non-uniform static prop scaling (by @Ozxybox).
Correctly handle non-float numeric values being passed to various
srctools.mathoperations.Compute the total vertex count for parsed models.
Version 2.3.9
Fix Cython version of
Vec.join()using a default ofx y z, notx, y, z.Added support for the Strata BSP format (by @Ozxybox).
Improve internal FGD database format to allow parsing entities as they are required. For best efficiency, use
EntityDef.engine_def()instead ofFGD.engine_dbase()if possible.Fix a few bugs with instance collapsing.
Version 2.3.8
Fix
srctools.loggerdiscardingtrio.MultiError(or its backport) if it bubbles up to the toplevel.Tweak VMF
localise()andtranslate()type hints to allowFrozenVecas the origin.Make movement and rotation of displacements work correctly.
Handle pitch keyvalues correctly when instancing, only rotating if it is a specific type.
Changed
srctools.instancing.collapse_one()to use the entclass database directly, deprecating thefgdparameter as a result.Fix
BSP.surfedgesincorrectly using edge0, which may cause a single invisible triangle in maps.
Version 2.3.7
Removed some unusable constructor parameters from
srctools.vmf.VMF, since they required passing in an object which requires the not-yet-constructedVMFas a parameter.Renamed
srctools.fgd.KeyValuestoKVDef, so it is not confused with KV1 trees.Replace
on_errorcallback insrctools.logger.init_logging()witherror, which now takes just anBaseException.SurfaceProphas been rewritten to useattrsto simplify code.Add
srctools.run.send_engine_command(), which executes console commands in a running Source game.VecandFrozenVecno longer inherits fromtyping.SupportsRound, since typeshed updated the overloads forround()to permit zero-arg calls to return a non-inttype.Permit VMFs to accept frozen math classes directly as keyvalues.
Fix multiplying vectors and
Vec.norm_mask()not producingFrozenVec.Parse errors in
BSP.entsare more informative and verbose.Add an additional callback parameter to
PackList.pack_into_zip()to finely control which files are packed.Implement vector and angle stringification manually, to ensure
.0prefixes are always removed.Use
FrozenVecandFrozenAnglein thedmxmodule instead ofnamedtuple()subclasses.Upgrade
srctools.dmx.Timeto a full class instead of atyping.NewType.Fix packlist logic inadvertently discarding
skinsetkeyvalue hints when packing models.Change behaviour of DMX
nameandidattributes to match game logic.nameis actually a regular attribute, but the uuid has a unique type and so can coexist with an attribute of the same name.Add support for Black Mesa’s static prop format.
Support integer values for soundscript channels, instead of just
CHAN_constants.Add a distinct exception (
RootEscapeError) for when../paths go above the root of a filesystem.
Version 2.3.6
Add ability to specify resources used in entities to the FGD file, move internal class resource definitions to the Hammer Addons repository.
Added new
srctools.fgd.EntityDef.get_resources()method, replacingfgd.entclass_*()methods.When parsing VMF outputs, assume extraneous commas are part of the parameter.
Add
FrozenVec,FrozenAngleandFrozenMatrix- immutable versions of the existing classes. This is a far better version ofVec_tuple, which is now deprecated.Build Python 3.11 wheels.
Drop dependency on
atomicwrites, it is no longer being maintained.
Version 2.3.5
Expand on documentation, build into explicit docs files.
Fix
srctools.logging.LoggerAdapter.log()being invalid in Python 3.7.Make
srctools.fgdwork when reloaded.Remove blank
srctools.choreomodule.Disable iterating on
srctools.math.Matrix, this is not useful.Add iterable parameter to
srctools.dmx.Attribute.array(), for constructing arrays with values.Fix DMX
booltofloatconversions mistakenly returningintinstead.Remove useless
header_lenattribute fromsrctools.vpk.VPK.Rename
srctools.property_parser.Propertytosrctools.keyvalues.Keyvalues, as well asNoKeyErrorandKeyValError.Allow parsing
srctools.fgd.IODeftypes which normally are not allowed for I/O. This will be substituted when exporting.Use
__class__.__name__in reprs, to better support subclasses.Issue #14: Disable some size checks on LZMA decompression, so more TF2 maps can be parsed.
Version 2.3.4
Add public submodules to
__all__.Disable escapes when parsing gameinfo files.
Add unprefixed
vtxfiles tosrctools.mdl.MDL_EXTS.Skip empty folder/extension dicts when writing VPK files.
Clean up VPK fileinfo dicts when deleting files.
Default
srctools.fgd.IODeftosrctools.fgd.ValueTypes.VOID.Sort tags when exporting FGDs, to make it determinstic.
Version 2.3.3
Writing out soundscript/particle cache can be non-atomic.
Vendor code from deprecated
chunk.Chunkstandard library class.Fix bad use of builtin generics.
Version 2.3.2
Make particle systems use a cache file for the manifest too.
Make
srctools.fgd.FGD.engine_dbase()actually cache and copy the database.Automatically add the
updatefolder to searchpath precedence, fixing HammerAddons Issue #164.Make DMX scalar type deduction more strict (removing iterable -> vec support), making it typesafe.
Add
Matrix.from_angstr().
Version 2.3.1
Fix
srctools.vmf.Output.combine()not handlingtimescorrectly.srctools.math.quickhull()is now public.Restrict
srctools.bsp.Overlay.min_cpu,max_cpu,min_gpuandmax_gputo valid values.Test against Python 3.11.
Read/write the
LEAFMINDISTTOWATERlump data intosrctools.bsp.VisLeaf.min_water_dist.Read/write the
LEAFWATERDATAlump.Copy flags when copying
srctools.bsp.TexInfofrom an existing source.srctools.tokenizer.Tokenizernow handles universal newlines conversion.Disallow newlines in keyvalues keys when parsing by default. This catches syntax errors earlier.
More
srctools.game.Gamegameinfo.txtfields are now optional.
Version 2.3.0
Postcompiler code has been moved to HammerAddons.
Fix raw sound filenames not stripping special characters from the start when packing.
Allow
srctools.dmx.Colorto omit alpha when parsed from strings, and roound/clamp values.Handle INFRA’s altered
srctools.bsp.Primitivelump.Read soundscripts and breakable chunk files with code page 1252.
Handle TF2’s LZMA compressed lumps.
Detect various alternate versions of
srctools.bsp.StaticProplumps, and parse them.srctools.vmf.Entitynow directly implementscollections.abc.MutableMapping. Direct access to theEntity.keysdictis deprecated.Correctly handle proxy blocks in
Materialpatch shaders.DMX stub and null elements use an immutable subclass, instead of having elements be None-able.
Disallow entities to have a blank classname.
Elide long arrays in element reprs.
Add some additional logs when finding propcombine models fails.
Clean up
srctools.Property.build()API.Make error messages more clear when
Tokenizer.error()is used directly with aToken.Include potential variables in
KeyErrorfromsrctools.vmf.EntityFixup.substitute().Remove support for deprecated
imghdrmodule.Upgrade plugin finding logic to ensure each source is mounted under a persistent ID.
Add missing
srctools.bsp.Face.dynamic_shadows.Deprecate
srctools.AtomicWriter, use theatomicwritesmodule.srctools._class_resourcesis now only imported when required.Use Cython when building, instead of including sources.
srctools.vmf.Entity.fixupwill instantiate theEntityFixupobject only when actually required.
Version 2.2.5
Restore
srctools.dmx.Attribute.iter_str()etc method’s ability to iterate scalars.Suppress warnings in
Property.copy().
Version 2.2.4
Fix behaviour of
Property.__getitem__()andProperty.__setitem__().Improve performance of
VPKparsing.Add support for Portal Revolution’s
FGDhelper tweaks.Add option to collapse and remove IO proxies entirely.
Fix
ModelCompilercreating directories with relative paths.Pass through unknown model flag bits unchanged.
Fix VPK ascii check.
Handle VMF groups correctly.
Add
Vec.bbox_intersect().Add
srctools.dmx.Attribute.iter_str()etc methods for iterating converted values. Directly iterating theAttributeis deprecated.Add
srctools.dmx.Attribute.append(),extend()andclear_array()methods.Fix corruption from mistaken deduplication of
srctools.bsp.VisLeafandPrimitivelumps.
Version 2.2.3
Fix use of builtin generics.
Version 2.2.2
Document some known particle manifest paths.
Handle double-spacing in animation particle options.
Improve type hints in
srctools.smd.
Version 2.2.1
Version 2.2.0
Make
srctools.compiler.mdl_compilergeneric, to allow typechecking results.Add
srctools.particles.DMX attributes may now be copied using the
copymodule, and also tested for equality.srctools.sndscript.Soundnow lazily creates operator stack keyvalue objects.srctools.packlist.PackListnow can pack particle systems, and generate particle manifests.Animation events which spawn particles are also detected.
Version 2.1.0
Fix
%-formatted logs breaking whensrctools.loggeris used.Add
Property.extend(), instead of using+or<Property.append()with a block. That usage is deprecated.Deprecate creating root properties with
name=None.srctools.filesys.FileSystemChainis no longer generic, this is not useful.Add functions which embed a Keyvalues1 tree in a DMX tree.