srctools.mdl

class srctools.mdl.Model(
filesystem: FileSysT,
file: File[FileSysT],
)

Represents parts of Source models.

This does not parse the animation or geometry data, only other metadata.

__init__(
filesystem: FileSysT,
file: File[FileSysT],
) None

Parse a model from a file.

__weakref__

list of weak references to the object (if defined)

_load(f: BinaryIO) None

Read data from the MDL file.

static _read_sequences(
f: BinaryIO,
count: int,
) List[Sequence]

Split this off to decrease stack in main parse method.

_cull_skins_table(
f: BinaryIO,
body_count: int,
) None

Fix the table of used skins to correspond to those actually used.

StudioMDL is rather messy, and adds many extra columns that are not used on the actual model. We’re following mstudiobodyparts_t -> mstudiomodel_t -> mstudiomesh_t -> material. While we’re here, store a count of the total vertexes used.

_parse_phy(
f: BinaryIO,
filename: str,
) None

Parse the physics data file, if present.

iter_textures(
skins: Iterable[int] | None = None,
) Iterator[str]

Yield textures used by this model.

Skins if given should be a set of skin indexes, which constrains the list. This looks up in the filesystem to determine which CDMaterials folder to use, if any.

Constants

class srctools.mdl.AnimEventTypes

Bases: Flag

Categories of animation events.

NONE = 0
SERVER = 1
SCRIPTED = 2
SHARED = 4
WEAPON = 8
CLIENT = 16
FACEPOSER = 32
srctools.mdl.CL = AnimEventTypes.CLIENT

Alias for the CLIENT event type.

srctools.mdl.SV = AnimEventTypes.SERVER

Alias for the Server event type.

class srctools.mdl.AnimEvents

Bases: Enum

The types of events in models.

0 - 999 is “specific” / new string-based type. 1000 - 1999 is for scripted events. 2000 - 2999 is shared events. 3000 - 4999 is weapon events. 5000+ is clientside events.

AE_EMPTY = 0
AE_NPC_LEFTFOOT = 1
AE_NPC_RIGHTFOOT = 2
AE_NPC_BODYDROP_LIGHT = 3
AE_NPC_BODYDROP_HEAVY = 4
AE_NPC_SWISHSOUND = 5
AE_NPC_180TURN = 6
AE_NPC_ITEM_PICKUP = 7
AE_NPC_WEAPON_DROP = 8
AE_NPC_WEAPON_SET_SEQUENCE_NAME = 9
AE_NPC_WEAPON_SET_SEQUENCE_NUMBER = 10
AE_NPC_WEAPON_SET_ACTIVITY = 11

Alias: AE_NPC_HOLSTER

AE_NPC_DRAW = 12
AE_NPC_WEAPON_FIRE = 13
AE_CL_PLAYSOUND = 14
AE_SV_PLAYSOUND = 15
AE_CL_STOPSOUND = 16
AE_START_SCRIPTED_EFFECT = 17
AE_STOP_SCRIPTED_EFFECT = 18
AE_CLIENT_EFFECT_ATTACH = 19
AE_MUZZLEFLASH = 20
AE_NPC_MUZZLEFLASH = 21
AE_THUMPER_THUMP = 22
AE_AMMOCRATE_PICKUP_AMMO = 23
AE_NPC_RAGDOLL = 24
AE_NPC_ADDGESTURE = 25
AE_NPC_RESTARTGESTURE = 26
AE_NPC_ATTACK_BROADCAST = 27
AE_NPC_HURT_INTERACTION_PARTNER = 28
AE_NPC_SET_INTERACTION_CANTDIE = 29
AE_SV_DUSTTRAIL = 30
AE_CL_CREATE_PARTICLE_EFFECT = 31
AE_RAGDOLL = 32
AE_CL_ENABLE_BODYGROUP = 33
AE_CL_DISABLE_BODYGROUP = 34
AE_CL_BODYGROUP_SET_VALUE = 35
AE_CL_BODYGROUP_SET_VALUE_CMODEL_WPN = 36
AE_WPN_PRIMARYATTACK = 37
AE_WPN_INCREMENTAMMO = 38
AE_WPN_HIDE = 39
AE_WPN_UNHIDE = 40
AE_WPN_PLAYWPNSOUND = 41
AE_RD_ROBOT_POP_PANELS_OFF = 42
AE_TAUNT_ENABLE_MOVE = 43
AE_TAUNT_DISABLE_MOVE = 44
AE_ASW_FOOTSTEP = 45
AE_MARINE_FOOTSTEP = 46
AE_MARINE_RELOAD_SOUND_A = 47
AE_MARINE_RELOAD_SOUND_B = 48
AE_MARINE_RELOAD_SOUND_C = 49
AE_REMOVE_CLIENT_AIM = 50
AE_MELEE_DAMAGE = 51
AE_MELEE_START_COLLISION_DAMAGE = 52
AE_MELEE_STOP_COLLISION_DAMAGE = 53
AE_SCREEN_SHAKE = 54
AE_START_DETECTING_COMBO = 55
AE_STOP_DETECTING_COMBO = 56
AE_COMBO_TRANSITION = 57

Alias: AE_ALLOW_MOVEMENT

AE_SKILL_EVENT = 59
AE_TUG_INCAP = 60
SCRIPT_EVENT_DEAD = 1000
SCRIPT_EVENT_NOINTERRUPT = 1001
SCRIPT_EVENT_CANINTERRUPT = 1002
SCRIPT_EVENT_FIREEVENT = 1003
SCRIPT_EVENT_SOUND = 1004
SCRIPT_EVENT_SENTENCE = 1005
SCRIPT_EVENT_INAIR = 1006
SCRIPT_EVENT_ENDANIMATION = 1007
SCRIPT_EVENT_SOUND_VOICE = 1008
SCRIPT_EVENT_SENTENCE_RND1 = 1009
SCRIPT_EVENT_NOT_DEAD = 1010
SCRIPT_EVENT_EMPHASIS = 1011
SCRIPT_EVENT_BODYGROUPON = 1020
SCRIPT_EVENT_BODYGROUPOFF = 1021
SCRIPT_EVENT_BODYGROUPTEMP = 1022
SCRIPT_EVENT_FIRE_INPUT = 1100
NPC_EVENT_BODYDROP_LIGHT = 2001
NPC_EVENT_BODYDROP_HEAVY = 2002
NPC_EVENT_SWISHSOUND = 2010
NPC_EVENT_180TURN = 2020
NPC_EVENT_ITEM_PICKUP = 2040
NPC_EVENT_WEAPON_DROP = 2041
NPC_EVENT_WEAPON_SET_SEQUENCE_NAME = 2042
NPC_EVENT_WEAPON_SET_SEQUENCE_NUMBER = 2043
NPC_EVENT_WEAPON_SET_ACTIVITY = 2044
NPC_EVENT_LEFTFOOT = 2050
NPC_EVENT_RIGHTFOOT = 2051
NPC_EVENT_OPEN_DOOR = 2060
EVENT_WEAPON_MELEE_HIT = 3001
EVENT_WEAPON_SMG1 = 3002
EVENT_WEAPON_MELEE_SWISH = 3003
EVENT_WEAPON_SHOTGUN_FIRE = 3004
EVENT_WEAPON_THROW = 3005
EVENT_WEAPON_AR1 = 3006
EVENT_WEAPON_AR2 = 3007
EVENT_WEAPON_HMG1 = 3008
EVENT_WEAPON_SMG2 = 3009
EVENT_WEAPON_MISSILE_FIRE = 3010
EVENT_WEAPON_SNIPER_RIFLE_FIRE = 3011
EVENT_WEAPON_AR2_GRENADE = 3012
EVENT_WEAPON_THROW2 = 3013
EVENT_WEAPON_PISTOL_FIRE = 3014
EVENT_WEAPON_RELOAD = 3015
EVENT_WEAPON_THROW3 = 3016
EVENT_WEAPON_RELOAD_SOUND = 3017
EVENT_WEAPON_RELOAD_FILL_CLIP = 3018
EVENT_WEAPON_SMG1_BURST1 = 3101
EVENT_WEAPON_SMG1_BURSTN = 3102
EVENT_WEAPON_AR2_ALTFIRE = 3103
EVENT_WEAPON_SEQUENCE_FINISHED = 3900
CL_EVENT_MUZZLEFLASH0 = 5001
CL_EVENT_MUZZLEFLASH1 = 5011
CL_EVENT_MUZZLEFLASH2 = 5021
CL_EVENT_MUZZLEFLASH3 = 5031
CL_EVENT_SPARK0 = 5002
CL_EVENT_NPC_MUZZLEFLASH0 = 5003
CL_EVENT_NPC_MUZZLEFLASH1 = 5013
CL_EVENT_NPC_MUZZLEFLASH2 = 5023
CL_EVENT_NPC_MUZZLEFLASH3 = 5033
CL_EVENT_SOUND = 5004
CL_EVENT_EJECTBRASS1 = 6001
CL_EVENT_DISPATCHEFFECT0 = 9001
CL_EVENT_DISPATCHEFFECT1 = 9011
CL_EVENT_DISPATCHEFFECT2 = 9021
CL_EVENT_DISPATCHEFFECT3 = 9031
CL_EVENT_DISPATCHEFFECT4 = 9041
CL_EVENT_DISPATCHEFFECT5 = 9051
CL_EVENT_DISPATCHEFFECT6 = 9061
CL_EVENT_DISPATCHEFFECT7 = 9071
CL_EVENT_DISPATCHEFFECT8 = 9081
CL_EVENT_DISPATCHEFFECT9 = 9091
CL_EVENT_SPRITEGROUP_CREATE = 6002
CL_EVENT_SPRITEGROUP_DESTROY = 6003
CL_EVENT_FOOTSTEP_LEFT = 6004
CL_EVENT_FOOTSTEP_RIGHT = 6005
CL_EVENT_MFOOTSTEP_LEFT = 6006
CL_EVENT_MFOOTSTEP_RIGHT = 6007
CL_EVENT_MFOOTSTEP_LEFT_LOUD = 6008
CL_EVENT_MFOOTSTEP_RIGHT_LOUD = 6009
CSS_FOOT_WATER_SPLASH = 7001
CSS_FOOT_WATER_RIPPLE = 7002
CSGO_FOOT_JUMP = 4001
CSGO_FOOT_WALK = 4002
srctools.mdl.ANIM_EVENT_BY_INDEX: dict[int, AnimEvents]

Maps ordinal indexes to AnimEvents.

srctools.mdl.ANIM_EVENT_BY_NAME: dict[str, AnimEvents]

Maps string names to AnimEvents.

Components

class srctools.mdl.IncludedMDL(label: str, filename: str)

Additional model files to load animations from.

label: str
filename: str
class srctools.mdl.SeqEvent(
type: AnimEvents | str,
cycle: float,
options: str,
)

An event that occurs at some point in an animation sequence.

type: AnimEvents | str
cycle: float
options: str
class srctools.mdl.Sequence(
label: str,
act_name: str,
flags: int,
act_weight: int,
events: List[SeqEvent],
bbox_min: Vec,
bbox_max: Vec,
keyvalues: str,
)

An animation sequence.

label: str
act_name: str
flags: int
act_weight: int
events: List[SeqEvent]
bbox_min: Vec
bbox_max: Vec
keyvalues: str