srctools.const

This module contains various constants and enums that are useful for multiple modules.

srctools.const.add_unknown(
ns: MutableMapping[str, Any],
long: int | bool = False,
) None

Adds dummy members for enum.Flag to allow all bits to be set.

It should be called at the end of the class body, like so:

class SomeFlags(Flag):
    A = 1
    B = 2
    C = 16
    add_unknown(locals())
SomeFlags(255) # == SomeFlags.A|B|C|2|3|5|6|7: 255>

This is useful to allow for some compatibility with unhandled games, ensuring extra bits are preserved when resaving. Each member will be named with the position of its bit.

Parameters:
  • ns – The class namespace to add members to. This should be set to locals() or vars().

  • long – If True, extend to 64 bits, not 32 bits. Alternatively, pass an integer to specify a specific number of bits.

class srctools.const.GameID

Bases: Enum

Steam appIDs for Source Engine games.

BASE_SOURCE_ENGINE_2 = '212'
SOURCE_BASE_2007 = '216'

Alias: SRC_2007

ORANGE_BOX_MULTIPLAYER = '217'

Alias: OBOX_MP

HALF_LIFE_2 = '220'

Alias: HL2

COUNTER_STRIKE_SOURCE = '240'

Alias: CS

HALF_LIFE_SOURCE = '280'

Alias: HL1

DAY_OF_DEFEAT_SOURCE = '300'

Alias: DOD

ALL_SOURCE_ENGINE_PATHS_HL2 = '312'
HALF_LIFE_2_DEATHMATCH = '320'

Alias: HL2_DM

HALF_LIFE_2_LOST_COAST = '340'

Alias: HL2_LC

HALF_LIFE_DEATHMATCH_SOURCE = '360'

Alias: HL_DM

HALF_LIFE_2_EPISODE_1 = '380'

Alias: HL2_EP1

PORTAL = '400'

Alias: P1

HALF_LIFE_2_EPISODE_TWO = '420'

Alias: HL2_EP2

TEAM_FORTRESS_2 = '440'

Alias: TF2

LEFT_4_DEAD = '500'

Alias: L4D

DOTA_2 = '570'

Alias: DOTA2

PORTAL_2 = '620'

Alias: P2

APERTURE_TAG = '280740'

Alias: TAG

THINKING_WITH_TIME_MACHINE = '286080'

Alias: TWTM

PORTAL_STORIES_MEL = '317400'

Alias: MEL

REXAURA = '317790'
ALIEN_SWARM = '630'

Alias: ASW

COUNTER_STRIKE_GLOBAL_OFFENSIVE = '730'

Alias: CSGO

SIN_EPISODES_EMERGENCE = '1300'
SIN_EPISODES_ARENA = '1308'
SIN_EPISODES_UNABRIDGED = '1316'
DARK_MESSIAH_OF_MIGHT_AND_MAGIC = '2100'

Alias: DM_MAM

DARK_MESSIAH_MIGHT_AND_MAGIC_MULTIPLAYER = '2130'

Alias: DM_MAM_MP

THE_SHIP = '2400'

Alias: SHIP

BLOODY_GOOD_TIME = '2450'

Alias: BGT

VAMPIRE_THE_MASQUERADE_BLOODLINES = '2600'

Alias: VTMB

GARRYS_MOD = '4000'

Alias: GARRY

ZOMBIE_PANIC_SOURCE = '17500'

Alias: ZP

AGE_OF_CHIVALRY = '17510'

Alias: AOC

SYNERGY = '17520'
DIPRIP = '17530'
ETERNAL_SILENCE = '17550'
PIRATES_VIKINGS_KNIGHTS_II = '17570'

Alias: PVKII

DYSTOPIA = '17580'
INSURGENCY = '17700'
NUCLEAR_DAWN = '17710'
SMASHBALL = '17730'
INSURGENCY_2 = '222880'
CONTAGION = '238430'
class srctools.const.FileType

Bases: Enum

Different kinds of files for Source, mainly to indicate resources to pack.

If this represents a specific file type, the value is the extension. Otherwise, it’s an arbitrary integer. That occurs for things like soundscript entries which are arbitary names.

GENERIC = 0

Arbitrary file type.

SOUNDSCRIPT = 1

Script file containing soundscripts.

GAME_SOUND = 2

world.blah sound - lookup the soundscript, and raw files.

RAW_SOUND = 'wav'

A WAV/MP3/OGG sound file.

PARTICLE = 3

Alias: PARTICLE_SYSTEM

The name of a particle system.

PARTICLE_FILE = 'pcf'

A particle collection file.

VSCRIPT_SQUIRREL = 'nut'

Squirrel VScript file.

ENTITY = 4

Classname of another entity that this entity includes. This is only permitted in the FGD file.

ENTCLASS_FUNC = 5

Name of a function to call defined inside the packlist module. This is used to mark entities which require special handling.

BREAKABLE_CHUNK = 6

Randomised generic chunk gibs. This corresponds to g_PropDataSystem.GetRandomChunkModel().

WEAPON_SCRIPT = 7

A script file loaded for weapons, referencing models and sounds.

MATERIAL = 'vmt'

Material file.

TEXTURE = 'vtf'

VTF texture, implicitly looks for .hdr.vtf too.

CHOREO = 'vcd'

Choreographed scenes.

MODEL = 'mdl'

Source model, implies the vtx, vvd, phy files too.

class srctools.const.BSPContents

Bases: Flag

The various CONTENTS_* flags, indicating different collision types.

This is normally for brushes, but is also used on other things like models.

EMPTY = 0x0
SOLID = 0x1

Regular solid brush. Player camera is not valid inside here.

WINDOW = 0x2

Translucent glass.

AUX = 0x4
GRATE = 0x8

Grating, bullets/LOS pass, objects do not.

SLIME = 0x10

Slime-style liquid, opaque.

WATER = 0x20

Is a water brush

MIST = 0x40
OPAQUE = 0x80

Blocks LOS

TEST_FOG_VOLUME = 0x100

May be non-solid, but cannot be seen through.

TEAM1 = 0x800

Special team-only clips.

TEAM2 = 0x1000

Special team-only clips.

IGNORE_NODRAW_OPAQUE = 0x2000

“Ignore CONTENTS_OPAQUE on surfaces that have SURF_NODRAW.

MOVABLE = 0x4000
AREAPORTAL = 0x8000

Is an areaportal brush.

PLAYER_CLIP = 0x10000

Functions like tools/toolsplayerclip.

NPC_CLIP = 0x20000

Functions like tools/toolsclip.

CURRENT_0 = 0x40000

Specifies water currents, can be mixed.

CURRENT_90 = 0x80000
CURRENT_180 = 0x100000
CURRENT_270 = 0x200000
CURRENT_UP = 0x400000
CURRENT_DOWN = 0x800000
ORIGIN = 0x1000000

Behaves like a tools/toolsorigin brush, used to set origin. This is Goldsource era and is very deprecated.

NPC = 0x2000000

This shouldn’t be on brushes, it’s used for NPCs.

DEBRIS = 0x4000000
DETAIL = 0x8000000

The brush is marked as func_detail.

TRANSLUCENT = 0x10000000

A face uses $translucent, $alphatest, $alpha, etc.

LADDER = 0x20000000
HITBOX = 0x40000000
class srctools.const.SurfFlags

Bases: Flag

The various SURF_* flags, indicating different attributes for faces.

NONE = 0x0
LIGHT = 0x1

The face has lighting info.

SKYBOX_2D = 0x2

Nodraw, but when visible 2D skybox should be rendered.

SKYBOX_3D = 0x4

Nodraw, but when visible 2D and 3D skybox should be rendered.

WATER_WARP = 0x8

According to the header, “turbulent water warp”.

TRANSLUCENT = 0x10

Translucent material.

NOPORTAL = 0x20

Portalgun blocking material.

TRIGGER = 0x40

XBox only - is a trigger surface.

NODRAW = 0x80

Texture isn’t used, it’s invisible.

HINT = 0x100

A hint brush.

SKIP = 0x200

Skip brush, removed from map.

NOLIGHT = 0x400

No light needs to be calculated for the surface.

BUMPLIGHT = 0x800

Needs three lightmaps for bumpmapping.

NO_SHADOWS = 0x1000

Doesn’t receive shadows.

NO_DECALS = 0x2000

Rejects decals.

NO_SUBDIVIDE = 0x4000

Not allowed to split up the brush face.

HITBOX = 0x8000

According to the header, “Part of a hitbox”.