- Handle the special $gender "variable" in WAV filenames.
- Add prop_door_rotating class resource function.
- Remove weapon_script class resource function, instead use a direct resource in the FGD.
- Use typing_extensions.deprecated to mark functions and methods which should not be used.
- 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 :py:meth:`srctools.bsp.BModel.clear_physics()`, to delete physics data for a brush model.
- Add :py:class:`srctools.Keyvalues.LeafKeyvalueError`, raised when block-only operations are attempted on leaf keyvalues. This improves the messages raised and makes them consistent.
- Fix :py:class:`srctools.vtf.Frame` indexing behaviour. It would access totally incorrect pixels.
- Correctly read/write L4D2's BSP format.
- Fix :py:meth:`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 :py:meth:`srctools.vtf.Frame.fill()`, for filling a frame with a constant colour.
- Add support for Chaos non-uniform static prop scaling (by @ozxybox).
- Correctly handle non-float numeric values being passed to various :py:mod:`srctools.math` operations.
- Compute the total vertex count for parsed models.
- Fix Cython version of :py:meth:`Vec.join() <srctools.math.VecBase.join>` using a default of :samp:`{x} {y} {z}`, not :samp:`{x}, {y}, {z}`.
- Added support for the Chaos BSP format (by @ozxybox).
- Improve internal FGD database format to allow parsing entities as they are required. For best efficiency, use :py:meth:`EntityDef.engine_def() <srctools.fgd.EntityDef.engine_def>` instead of :py:meth:`FGD.engine_dbase() <srctools.fgd.FGD.engine_dbase()>` if possible.
- Fix a few bugs with instance collapsing.
- Fix :py:mod:`srctools.logger` discarding :external:py:class:`MultiError` (or its backport) if it bubbles up to the toplevel.
- Tweak VMF
localise()
andtranslate()
type hints to allow :py:class:`~srctools.math.FrozenVec` as 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 :py:func:`srctools.instancing.collapse_one()` to use the entclass database directly,
deprecating the
fgd
parameter as a result. - Fix :py:attr:`BSP.surfedges <srctools.bsp.BSP.surfedges>` incorrectly using edge
0
, which may cause a single invisible triangle in maps.
- Removed some unusable constructor parameters from :py:class:`srctools.vmf.VMF`, since they required passing in an object which requires the not-yet-constructed :py:class:`~srctools.vmf.VMF` as a parameter.
- Renamed
srctools.fgd.KeyValues
toKVDef
, so it is not confused with KV1 trees. - Replace
on_error
callback in :py:meth:`srctools.logger.init_logging()` witherror
, which now takes just an :external:py:class:`BaseException`. - :py:class:`~srctools.surfaceprop.SurfaceProp` has been rewritten to use
attrs
to simplify code. - Add :py:func:`srctools.run.send_engine_command()`, which executes console commands in a running Source game.
- :py:class:`~srctools.math.Vec` and :py:class:`~srctools.math.FrozenVec` no longer inherits from :external:py:class:`typing.SupportsRound`, since typeshed updated the overloads for :external:py:func:`round()` to permit zero-arg calls to return a non-:external:py:class:`int` type.
- Permit VMFs to accept frozen math classes directly as keyvalues.
- Fix multiplying vectors and :py:meth:`Vec.norm_mask() <srctools.math.VecBase.norm_mask()>` not producing :py:class:`~srctools.math.FrozenVec`.
- Parse errors in
BSP.ents
are more informative and verbose. - Add an additional callback parameter to :py:meth:`PackList.pack_into_zip() <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 :py:class:`~srctools.math.FrozenVec` and :py:class:`~srctools.math.FrozenAngle` in the :py:class:`~srctools.dmx` module instead of :external:py:func:`~collections.namedtuple` subclasses.
- Upgrade :py:class:`srctools.dmx.Time` to a full class instead of a :external:py:class:`typing.NewType`.
- Fix packlist logic inadvertently discarding
skinset
keyvalue hints when packing models. - Change behaviour of DMX
name
andid
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 (:py:class:`~srctools.filesys.RootEscapeError`) for when :file:`../` paths go above the root of a filesystem.
- Add ability to specify resources used in entities to the FGD file, move internal class resource definitions to the Hammer Addons repository.
- Added new :py:meth:`srctools.fgd.EntityDef.get_resources()` method, replacing
fgd.entclass_*()
methods. - When parsing VMF outputs, assume extraneous commas are part of the parameter.
- Add :py:class:`~srctools.math.FrozenVec`, :py:class:`~srctools.math.FrozenAngle` and
:py:class:`~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.
- Expand on documentation, build into explicit docs files.
- Fix :py:meth:`!srctools.logging.LoggerAdapter.log` being invalid in Python 3.7.
- Make :py:mod:`srctools.fgd` work when reloaded.
- Remove blank
srctools.choreo
module. - Disable iterating on :py:class:`srctools.math.Matrix`, this is not useful.
- Add iterable parameter to :py:meth:`srctools.dmx.Attribute.array()`, for constructing arrays with values.
- Fix DMX :external:py:class:`bool` to :external:py:class:`float` conversions mistakenly returning :external:py:class:`int` instead.
- Remove useless
header_len
attribute from :py:class:`srctools.vpk.VPK`. - Rename
srctools.property_parser.Property
to :py:class:`srctools.keyvalues.Keyvalues`, as well as :py:class:`~srctools.keyvalues.NoKeyError` and :py:class:`~srctools.keyvalues.KeyValError`. - Allow parsing :py:class:`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.
- Add public submodules to
__all__
. - Disable escapes when parsing gameinfo files.
- Add unprefixed
vtx
files to :py:data:`srctools.mdl.MDL_EXTS`. - Skip empty folder/extension dicts when writing VPK files.
- Clean up VPK fileinfo dicts when deleting files.
- Default :py:class:`srctools.fgd.IODef` to :py:attr:`srctools.fgd.ValueTypes.VOID`.
- Sort tags when exporting FGDs, to make it determinstic.
- Writing out soundscript/particle cache can be non-atomic.
- Vendor code from deprecated
chunk.Chunk
standard library class. - Fix bad use of builtin generics.
- Make particle systems use a cache file for the manifest too.
- Make :py:meth:`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 :py:data:`srctools.filesys.CACHE_KEY_INVALID`.
- Add :py:meth:`srctools.math.Matrix.from_angstr()`.
- Fix :py:meth:`srctools.vmf.Output.combine` not handling
times
correctly. - :py:func:`srctools.math.quickhull()` is now public.
- Add :py:meth:`srctools.bsp.BSP.is_cordoned_heuristic()`.
- Restrict :py:attr:`srctools.bsp.Overlay.min_cpu`, :py:attr:`~srctools.bsp.Overlay.max_cpu`, :py:attr:`~srctools.bsp.Overlay.min_gpu` and :py:attr:`~srctools.bsp.Overlay.max_gpu` to valid values.
- Test against Python 3.11.
- Read/write the :py:attr:`~srctools.bsp.BSP_LUMPS.LEAFMINDISTTOWATER` lump data into :py:attr:`srctools.bsp.VisLeaf.min_water_dist`.
- Read/write the :py:attr:`~srctools.bsp.BSP_LUMPS.LEAFWATERDATA` lump.
- Copy flags when copying :py:class:`srctools.bsp.TexInfo` from an existing source.
- :py:class:`srctools.tokenizer.Tokenizer` now handles universal newlines conversion.
- Disallow newlines in keyvalues keys when parsing by default. This catches syntax errors earlier.
- More :py:class:`srctools.game.Game`
gameinfo.txt
fields are now optional.
- Postcompiler code has been moved to HammerAddons.
- Fix raw sound filenames not stripping special characters from the start when packing.
- Allow :py:class:`srctools.dmx.Color` to omit alpha when parsed from strings, and roound/clamp values.
- Handle INFRA's altered :py:class:`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 :py:class:`srctools.bsp.StaticProp` lumps, and parse them.
- :py:class:`srctools.vmf.Entity` now directly implements
:external:py:class:`collections.abc.MutableMapping`. Direct access to the
Entity.keys
:external:py:class:`dict` is deprecated. - Correctly handle proxy blocks in :py:class:`~srctools.vmt.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 :py:meth:`!srctools.Property.build()` API.
- Make error messages more clear when :py:meth:`srctools.tokenizer.Tokenizer.error()` is used directly with a :py:class:`~srctools.tokenizer.Token`.
- Include potential variables in :external:py:class:`KeyError` from :py:meth:`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 :py:attr:`srctools.bsp.Primitive.dynamic_shadows`.
- Deprecate :py:class:`srctools.AtomicWriter`, use the
atomicwrites
module. - :py:mod:`srctools._class_resources` is now only imported when required.
- Use Cython when building, instead of including sources.
- :py:attr:`srctools.vmf.Entity.fixup` will instantiate the :py:class:`~srctools.vmf.EntityFixup` object only when actually required.
- Restore :py:meth:`srctools.dmx.Attribute.iter_str()` etc method's ability to iterate scalars.
- Suppress warnings in :py:meth:`srctools.Property.copy()`.
- Fix behaviour of :py:meth:`Property.__getitem__() <srctools.keyvalues.Keyvalues.__getitem__()>` and :py:meth:`Property.__setitem__() <srctools.keyvalues.Keyvalues.__setitem__()>`.
- Improve performance of :py:class:`~srctools.vpk.VPK` parsing.
- Add support for Portal Revolution's :py:class:`~srctools.fgd.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 :py:meth:`srctools.math.Vec.bbox_intersect`.
- Allow indexing :py:class:`~srctools.vmf.PrismFace` objects by a normal to get a :py:class:`~srctools.vmf.Side`.
- Add :py:meth:`srctools.dmx.Attribute.iter_str()` etc methods for iterating converted values. Directly iterating the :py:class:`~srctools.dmx.Attribute` is deprecated.
- Add :py:meth:`srctools.dmx.Attribute.append()`, :py:meth:`~srctools.dmx.Attribute.extend()` and :py:meth:`~srctools.dmx.Attribute.clear_array()` methods.
- Fix corruption from mistaken deduplication of :py:class:`srctools.bsp.VisLeaf` and :py:class:`~srctools.bsp.Primitive` lumps.
- Fix use of builtin generics.
- Document some known particle manifest paths.
- Handle double-spacing in animation particle options.
- Improve type hints in :py:mod:`srctools.smd`.
- Missing particles is now an warning, not an error.
- Particles are now case-insensitive.
- py:meth:srctools.vmf.EntityFixup.keys(), :py:meth:`~srctools.vmf.EntityFixup.values()` and :py:meth:`~srctools.vmf.EntityFixup.items()` are now full mapping views.
- Fix incompatibility with some Python versions.
- Make
srctools.compiler.mdl_compiler
generic, to allow typechecking results. - Add :py:mod:`srctools.particles`.
- DMX attributes may now be copied using the :external:py:mod:`copy` module, and also tested for equality.
- :py:class:`srctools.sndscript.Sound` now lazily creates operator stack keyvalue objects.
- :py:class:`srctools.packlist.Packlist` now can pack particle systems, and generate particle manifests.
- Animation events which spawn particles are also detected.
- Fix
%
-formatted logs breaking when :py:mod:`srctools.logger` is used. - Add :py:meth:`Property.extend()`, instead of using
+
or :py:meth:`Property.append()` with a block. That usage is deprecated. - Deprecate creating root properties with
name=None
. - :py:class:`srctools.filesys.FileSystemChain` is no longer generic, this is not useful.
- Add functions which embed a Keyvalues1 tree in a DMX tree.