Changelog

Dev branch

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-constructed VMF as a parameter.
  • Renamed srctools.fgd.KeyValues to KVDef, so it is not confused with KV1 trees.
  • Replace on_error callback in srctools.logger.init_logging() with error, which now takes just an BaseException.
  • SurfaceProp has been rewritten to use attrs to simplify code.
  • Add srctools.run.send_engine_command(), which executes console commands in a running Source game.
  • Vec and FrozenVec no longer inherits from typing.SupportsRound, since typeshed updated the overloads for round() to permit zero-arg calls to return a non-int type.
  • Permit VMFs to accept frozen math classes directly as keyvalues.
  • Fix multiplying vectors and norm_mask() not producing FrozenVec.
  • Parse errors in BSP.ents are more informative and verbose.
  • Add an additional callback parameter to srctools.packlist.PackList.pack_into_zip() to finely control which files are packed.
  • Implement vector and angle stringification manually, to ensure .0 prefixes are always removed.
  • Use FrozenVec and FrozenAngle in the dmx module instead of namedtuple() subclasses.
  • Upgrade srctools.dmx.Time to a full class instead of a typing.NewType.
  • Fix packlist logic inadvertently discarding skinset keyvalue hints when packing models.
  • Change behaviour of DMX name and id attributes to match game logic. name is 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, replacing fgd.entclass_*() methods.
  • When parsing VMF outputs, assume extraneous commas are part of the parameter.
  • Add srctools.math.FrozenVec, srctools.math.FrozenAngle and srctools.math.FrozenMatrix - immutable versions of the existing classes. This is a far better version of Vec_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.fgd work when reloaded.
  • Remove blank srctools.choreo module.
  • 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 bool to float conversions mistakenly returning int instead.
  • Remove useless header_len attribute from srctools.vpk.VPK.
  • Rename srctools.property_parser.Property to srctools.keyvalues.Keyvalues, as well as NoKeyError and KeyValError.
  • Allow parsing srctools.fgd.IODef types 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 vtx files to srctools.mdl.MDL_EXTS.
  • Skip empty folder/extension dicts when writing VPK files.
  • Clean up VPK fileinfo dicts when deleting files.
  • Default srctools.fgd.IODef to srctools.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.Chunk standard 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_db() actually cache and copy the database.
  • Automatically add the update folder to searchpath precedence, fixing TeamSpen210/HammerAddons#164.
  • Make DMX scalar type deduction more strict (removing iterable -> vec support), making it typesafe.
  • Add srctools.filesys.CACHE_KEY_INVALID.
  • Add srctools.math.Matrix.from_angstr().

Version 2.3.1

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.Color to omit alpha when parsed from strings, and roound/clamp values.
  • Handle INFRA’s altered srctools.bsp.Primitive lump.
  • Read soundscripts and breakable chunk files with code page 1252.
  • Handle TF2’s LZMA compressed lumps.
  • Detect various alternate versions of srctools.bsp.StaticProp lumps, and parse them.
  • srctools.vmf.Entity now directly implements collections.abc.MutableMapping. Direct access to the Entity.keys dict is deprecated.
  • Correctly handle proxy blocks in VMT patch 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 srctools.tokenizer.Tokenizer.error() is used directly with a Token.
  • Include potential variables in KeyError from srctools.vmf.EntityFixup.substitute().
  • Remove support for deprecated imghdr module.
  • Upgrade plugin finding logic to ensure each source is mounted under a persistent ID.
  • Add missing srctools.bsp.Primitive.dynamic_shadows.
  • Deprecate srctools.AtomicWriter, use the atomicwrites module.
  • srctools._class_resources is now only imported when required.
  • Use Cython when building, instead of including sources.
  • srctools.vmf.Entity.fixup will instantiate the EntityFixup object only when actually required.

Version 2.2.5

Version 2.2.4

  • Fix behaviour of srctools.Property.__getitem__() and __setitem__().
  • Improve performance of VPK parsing.
  • Add support for Portal Revolution’s FGD helper tweaks.
  • Add option to collapse and remove IO proxies entirely.
  • Fix ModelCompiler creating directories with relative paths.
  • Pass through unknown model flag bits unchanged.
  • Fix VPK ascii check.
  • Handle VMF groups correctly.
  • Add srctools.math.Vec.bbox_intersect().
  • Allow indexing PrismFace objects by a normal to get a Side.
  • Add srctools.dmx.Attribute.iter_str() etc methods for iterating converted values. Directly iterating the Attribute is deprecated.
  • Add srctools.dmx.Attribute.append(), extend() and clear_array() methods.
  • Fix corruption from mistaken deduplication of srctools.bsp.VisLeaf and Primitive lumps.

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

  • Missing particles is now an warning, not an error.
  • Particles are now case-insensitive.
  • py:meth:srctools.vmf.EntityFixup.keys(), values() and items() are now full mapping views.
  • Fix incompatibility with some Python versions.

Version 2.2.0

  • Make srctools.compiler.mdl_compiler generic, to allow typechecking results.
  • Add srctools.particles.
  • DMX attributes may now be copied using the copy module, and also tested for equality.
  • srctools.sndscript.Sound now lazily creates operator stack keyvalue objects.
  • srctools.packlist.Packlist now can pack particle systems, and generate particle manifests.
  • Animation events which spawn particles are also detected.

Version 2.1.0

  • Fix %-formatted logs breaking when srctools.logger is 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.FileSystemChain is no longer generic, this is not useful.
  • Add functions which embed a Keyvalues1 tree in a DMX tree.