Black Mesa loads NPC variants (as well as variation for ragdolls!) using scripts/character_manifest.txt
I’m not sure if the game will allow you to cleanly override that file at this point in time, especially with workshop mods, but it might work if you use a custom/ folder.
The manifest works two ways - one, it can override an NPCs appearance by targetname, or two, it can select the appearance based on the NPC type - either way the formatting is the same;
At the top of the block, you have the preset name - this is either the targetname of the specific NPC you want to define a look for, or a classname, in which case it’ll be added to a list of random appearances that the NPC type might take on when it spawns.
After that, you have a section for the flex data - this is what Black Mesa uses to give its base heads some variation, though your models might not be set up with that in mind. You can select any face flex (including ones for facial animation, so be careful!) and give it a float value between 0 and 1.
Then we have the bodygroup data - this is probably what you’ll find to be the most powerful, since you’re making custom models. You can select any bodygroup on the model, by name, and give it a specific body to use, or a list.
After that, there’s a line to define what model the NPC will actually be using - this means you don’t need to override models/humans/marine.mdl
if you don’t want to, but can just add new variants instead. The base game uses this to swap between pristine and injured scientists and guards, as well as provide extra skin variants for the base male head, but as long as you’re feeding it a valid NPC model it should work fine with anything.
Finally, there’s a line that tells you what skins to use - again, this can be a single entry, or a list.
I know this has been a huge block of text, and I didn’t actually give you any code - I just wanted to provide a base understanding so you know what everything means/can do before I give you the actual syntax example, as seen below:
npc_human_grunt
{
flex_data
{
brow_h 1.0
neck_size 0.75
}
bodygroup_data
{
head 2
gloves 0,1
holster 1
packs_chest 0,1
packs_hips 0,1
packs_thigh 0,1
}
model "models/humans/marine.mdl"
skin 0,2
}
If memory serves, you can also give a list of float values between face flexors as well, though I’m not seeing any precedent for that in the original file so it’s probably safer to just use different definitions for those.