[L4D2] GUIStudioMDL 2.2 Compile Error - 'Rule for unknown flex'

Prolly been asked a dozen times, but I’m stuck as to how I can fix this. I’ve compiled a Bill model and got it working in game. All rigged, textured, no problems there. But giving him facial expressions is really starting to piss me off. I keep getting this error.


qdir:    "c:\users\jack\desktop\survivor_bill\models\survivors\decompile\"
gamedir: "C:\Program Files (x86)\Steam\steamapps\common\left 4 dead 2\left4dead2\"
g_path:  "C:\Users\Jack\Desktop\Survivor_Bill\models\survivors\decompile\mdldecompiler.qc"
Building binary model files...
Working on "mdldecompiler.qc"
SMD MODEL C:\Users\Jack\Desktop\Survivor_Bill\models\survivors\decompile/NamVet_reference_ORIGINAL.dmx.smd
VTA MODEL C:\Users\Jack\Desktop\Survivor_Bill\models\survivors\decompile/dmx/namvet_shapes.vta
WARNING: unknown studio command "àU^,ê4"
ERROR: c:\users\jack\desktop\survivor_bill\models\survivors\decompile\QCIs\survivor_facerules_legacy.qci(50): - Rule for unknown flex AU1R
ERROR: Aborted Processing on 'survivors/survivor_NamVet.mdl'

This is my QC:


$cd "C:\Users\Jack\Desktop\Survivor_Bill\models\survivors\decompile"
$modelname "survivors/survivor_NamVet.mdl"

//start eye/face data - BELOW HERE IS GENERATED BY QC_EYES, with some light modifications (the $definevariable part, and removing bodyrules, and eye controllers).
$definevariable exp$modelname survivors/survivor_NamVet.mdl
$definevariable expressions "dmx/namvet_shapes.vta"
$cdmaterials models\survivors\NamVet
$cdmaterials models\survivors
$bbox -13 -13 0 13 13 72
$ambientboost
//$forcecapsules
$texturegroup "ToggleDetailTexture"
{
	{ "bill_head" "bill_color" }
	{ "bill_head_it" "bill_color_it" }
}

//start eye/face data
$eyeposition 0 0 70

// Eyes can look this many degrees up/down/to the sides
$maxeyedeflection 30

//head controllers
$attachment "eyes" "ValveBiped.Bip01_Head1" -0.01 -2.77 68.13 absolute
$attachment "mouth" "ValveBiped.Bip01_Head1" 0.80 -5.80 -0.15 rotate 0 -80 -90
//$attachment "cigarette" "ValveBiped.Bip01_Head1" 0.26 -5.20 -1.20 rotate 0 -90 -90

$pushd "Smd"
$popd
$model NamVet "NamVet_reference_ORIGINAL.dmx.smd" {
	eyeball righteye "ValveBiped.Bip01_Head1" -1.22 -2.74 67.8 "eyeball_r" 1.00 4 "blue_pupil" 0.525
	eyeball lefteye "ValveBiped.Bip01_Head1" 1.22 -2.74 67.8 "eyeball_l" 1.00 -4 "blue_pupil" 0.525

	eyelid  upper_right "dmx/namvet_shapes" lowerer 1 -0.20 neutral 0 0.08 raiser 2 0.24 split 0.1 eyeball righteye
	eyelid  lower_right "dmx/namvet_shapes" lowerer 3 -0.32 neutral 0 -0.17 raiser 4 -0.10 split 0.1 eyeball righteye
	eyelid  upper_left "dmx/namvet_shapes" lowerer 1 -0.23 neutral 0 0.11 raiser 2 0.28 split -0.1 eyeball lefteye
	eyelid  lower_left "dmx/namvet_shapes" lowerer 3 -0.33 neutral 0 -0.22 raiser 4 -0.08 split -0.1 eyeball lefteye

	mouth 0 "mouth" "ValveBiped.Bip01_Head1" 0 1 0     // mouth illumination
	
	$include "QCIs/survivor_facerules_legacy.qci"
	$include "QCIs/survivors_bodyrules.qci"

}


$forcephonemecrossfade

//end eye/face data

$mostlyopaque
$surfaceprop "flesh"

$proceduralbones "DMX/namvet_helper_bones.vrd"

$sequence NamVet "NamVet_reference_ORIGINAL.dmx.smd"
$attachment "pistol" "ValveBiped.Bip01_R_Thigh" 3.31 0.69 -6.64 rotate -11.66 3.42 83.61
$attachment "cigarette" "ValveBiped.Bip01_Head1" -0.09 -5.01 1.82 rotate -31.69 -89.37 0.00
$attachment "L_weapon_bone" "ValveBiped.L_weapon_bone" 0.00 -0.00 -0.00 rotate 0.00 0.00 0.00
$attachment "weapon_bone" "ValveBiped.weapon_bone" 0.00 0.00 0.00 rotate 0.00 -0.00 0.00
$attachment "medkit" "ValveBiped.Bip01_Spine4" -1.27 -5.57 -1.31 rotate 5.03 77.16 0.00
$attachment "primary" "ValveBiped.Bip01_Spine4" 3.05 -4.91 -2.62 rotate -13.70 170.19 174.29
$attachment "melee" "ValveBiped.Bip01_Spine4" 2.64 -5.62 4.45 rotate 24 175 97
$attachment "attach_R_shoulderBladeAim" "ValveBiped.Bip01_Spine4" -10.54 -1.39 -5.08 rotate -90.00 -102.85 0.00
$attachment "attach_L_shoulderBladeAim" "ValveBiped.Bip01_Spine4" -10.54 -1.39 3.51 rotate -90.00 -102.85 0.00
$attachment "molotov" "ValveBiped.Bip01_Spine" -3.59 -2.79 7.97 rotate -63.44 -74.67 -101.41
$attachment "grenade" "ValveBiped.Bip01_Spine" -2.29 1.19 8.98 rotate -90.00 -175.23 0.00
$attachment "pills" "ValveBiped.Bip01_Spine" -2.96 0.71 -8.06 rotate -41.18 -88.48 -87.05
$attachment "lfoot" "ValveBiped.Bip01_L_Foot" 0.00 5.00 -0.00 rotate 0.00 0.00 0.00
$attachment "rfoot" "ValveBiped.Bip01_R_Foot" 0.00 5.00 -0.00 rotate -0.00 -0.00 -0.00
$attachment "muzzle_flash" "ValveBiped.Bip01_L_Hand" 0.00 0.00 0.00 rotate 0.00 0.00 0.00
$attachment "survivor_neck" "ValveBiped.Bip01_Neck1" 0.00 -0.00 0.00 rotate -0.00 0.00 -0.00
$attachment "forward" "ValveBiped.forward" 0.00 0.00 0.00 rotate 0.00 -0.00 -0.00
$attachment "bleedout" "ValveBiped.Bip01_Pelvis" 9.50 10.00 5.00 rotate -0.00 0.00 0.00
$attachment "survivor_light" "ValveBiped.Bip01_Spine2" 6.00 24.00 -0.00 rotate 0.00 -0.00 -0.00
$attachment "legL_B" "ValveBiped.attachment_bandage_legL" 0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$attachment "armL_B" "ValveBiped.attachment_bandage_armL" 0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$attachment "armL_T" "ValveBiped.attachment_armL_T" 0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$attachment "armR_T" "ValveBiped.attachment_armR_T" 0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$attachment "armL" "ValveBiped.Bip01_L_Forearm" 0.00 0.00 0.00 rotate -0.00 0.00 0.00
$attachment "legL" "ValveBiped.Bip01_L_Calf" 0.00 0.00 0.00 rotate -0.00 0.00 0.00
$attachment "thighL" "ValveBiped.Bip01_L_Thigh" 0.00 0.00 0.00 rotate -0.00 0.00 0.00
$attachment "spine" "ValveBiped.Bip01_Spine" 0.00 -0.00 0.00 rotate -90.00 -90.00 0.00
$includemodel "survivors/anim_NamVet.mdl"
$includemodel "survivors/gestures_namvet.mdl"
$includemodel survivors/anim_NamVet.mdl
$includemodel survivors/gestures_namvet.mdl

$include "QCIs/Namvet_bones.qci"
$include "QCIs/survivor_male_ruleshierarchy.qci"
$include "QCIs/survivor_attachments_shared.qci"
$include "QCIs/survivor_male_hitbox.qci"
$include "QCIs/survivor_male_ragdoll.qci"

$include "QCIs/survivors_bonemerge.qci"

And the qci mentioned in the error:


// add the editable flex controllers
flexcontroller eyelid right_lid_raiser left_lid_raiser 
flexcontroller eyelid right_lid_tightener left_lid_tightener
flexcontroller eyelid right_lid_droop left_lid_droop
flexcontroller eyelid right_lid_closer left_lid_closer
flexcontroller eyelid half_closed
flexcontroller eyelid blink
flexcontroller brow right_inner_raiser left_inner_raiser
flexcontroller brow right_outer_raiser left_outer_raiser 
flexcontroller brow right_lowerer left_lowerer
flexcontroller nose right_cheek_raiser left_cheek_raiser
flexcontroller nose right_wrinkler left_wrinkler dilator
flexcontroller mouth right_upper_raiser left_upper_raiser 
flexcontroller mouth right_corner_puller left_corner_puller
flexcontroller mouth right_corner_depressor left_corner_depressor
flexcontroller mouth chin_raiser
flexcontroller phoneme right_part left_part 
flexcontroller phoneme right_puckerer left_puckerer 
flexcontroller phoneme range 0 2 right_funneler left_funneler 
flexcontroller phoneme right_stretcher left_stretcher
flexcontroller phoneme bite presser tightener jaw_clencher
flexcontroller phoneme range 0 2.0 jaw_drop
flexcontroller phoneme right_mouth_drop left_mouth_drop

flexcontroller mouth right_cheek_puffer left_cheek_puffer
flexcontroller mouth range -1 1 mouth_sideways
flexcontroller mouth range -1 1 jaw_sideways

flexcontroller mouth lower_lip

localvar biter
%biter = bite

// eyelids tend toward 0 as center of vision
// FIXME: add a control to set how close to the COV the lids should match (blink == 0, normal == 1)
%upper_right_raiser = right_lid_raiser * (1 - right_lid_droop * 0.8) * (1 - right_lid_closer) * (1 - blink)
%upper_right_neutral = (1 - right_lid_droop * 0.8) * (1 - right_lid_raiser) * (1 - right_lid_closer) * (1 - blink)
%upper_right_lowerer = right_lid_closer + blink * (1 - right_lid_closer)
%upper_left_raiser = left_lid_raiser * (1 - left_lid_droop * 0.8) * (1 - left_lid_closer) * (1 - blink)
%upper_left_neutral = (1 - left_lid_droop * 0.8) * (1 - left_lid_raiser) * (1 - left_lid_closer) * (1 - blink)
%upper_left_lowerer = left_lid_closer + blink * (1 - left_lid_closer)

%lower_right_raiser = right_lid_closer
%lower_right_neutral = (1 - right_lid_closer) * (1 - right_lid_tightener * 0.5) * (1 - right_cheek_raiser * 0.25)
%lower_right_lowerer = 0
%lower_left_raiser = left_lid_closer
%lower_left_neutral = (1 - left_lid_closer) * (1 - left_lid_tightener * 0.5) * (1 - left_cheek_raiser * 0.25)
%lower_left_lowerer = 0

%AU1R = right_inner_raiser * (1 - right_outer_raiser) * (1 - right_lowerer)
%AU1L = left_inner_raiser * (1 - left_outer_raiser) * (1 - left_lowerer)
%AU2R = right_outer_raiser * (1 - right_inner_raiser) * (1 - right_lowerer)
%AU2L = left_outer_raiser * (1 - left_inner_raiser) * (1 - left_lowerer)
%AU4R = right_lowerer * (1 - right_inner_raiser) * (1 - right_outer_raiser)
%AU4L = left_lowerer * (1 - left_inner_raiser) * (1 - left_outer_raiser)

localvar AU1AU2AU4R AU1AU2AU4L
%AU1AU2AU4R = right_inner_raiser * right_outer_raiser * right_lowerer
%AU1AU2AU4L = left_inner_raiser * left_outer_raiser * left_lowerer
%AU1AU2R = right_inner_raiser * right_outer_raiser * (1 - right_lowerer) + %AU1AU2AU4R / 2
%AU1AU2L = left_inner_raiser * left_outer_raiser * (1 - left_lowerer) + %AU1AU2AU4L / 2
%AU1AU4R = right_inner_raiser * (1 - right_outer_raiser) * right_lowerer + %AU1AU2AU4R / 2
%AU1AU4L = left_inner_raiser * (1 - left_outer_raiser) * left_lowerer + %AU1AU2AU4L / 2
%AU2AU4R = right_outer_raiser * (1 - right_inner_raiser) * right_lowerer + %AU1AU2AU4R / 2
%AU2AU4L = left_outer_raiser * (1 - left_inner_raiser) * left_lowerer + %AU1AU2AU4L / 2

%AU38 = dilator

localvar right_open left_open
localvar right_lip_suppressor left_lip_suppressor

localvar lower_lip_active
%lower_lip_active = lower_lip * (1 - min( jaw_drop / 2, 1 ) 


%right_open = right_part + right_puckerer + right_funneler + right_upper_raiser * 0.5 + %lower_lip_active
%left_open = left_part + left_puckerer + left_funneler + left_upper_raiser * 0.5 + %lower_lip_active
%right_lip_suppressor = (1 - presser) * (1 - %biter)
%left_lip_suppressor = (1 - presser) * (1 - %biter)

localvar right_scaled_part left_scaled_part

%AU6R = right_cheek_raiser
%AU6L = left_cheek_raiser


// blend between part and smile

%right_scaled_part = right_part*(1-right_puckerer*((1/2)-right_funneler*(1/6))-right_funneler*(1/4))*%right_lip_suppressor
%left_scaled_part = left_part*(1-left_puckerer*((1/2)-left_funneler*(1/6))-left_funneler*(1/4))*%left_lip_suppressor
%AU25R = %right_scaled_part * (1 - right_corner_puller) 
%AU25L = %left_scaled_part * (1 - left_corner_puller)
%AU12AU25R = %right_scaled_part * right_corner_puller
%AU12AU25L = %left_scaled_part * left_corner_puller

// puckerer

%AU18R = right_puckerer*(1-right_part*((1/2)-right_funneler*(1/6))-right_funneler*(1/4))*%right_lip_suppressor
%AU18L = left_puckerer*(1-left_part*((1/2)-left_funneler*(1/6))-left_funneler*(1/4))*%left_lip_suppressor

// funneler

%AU22R = right_funneler*(1-right_part*((1/2)-right_puckerer*(1/3))-right_puckerer*(1/2))*%right_lip_suppressor
%AU22L = left_funneler*(1-left_part*((1/2)-left_puckerer*(1/3))-left_puckerer*(1/2))*%left_lip_suppressor

// pick the upper raiser based on the lips being parted or not

localvar right_raiser_suppressor left_raiser_suppressor
%right_raiser_suppressor = (1 - 0.3 * %AU22R) * (1 - 0.5 * %AU18R) * (1 - presser) * (1 - %biter) * (1 - right_corner_puller) * (1 - 0.5 * jaw_drop)
%left_raiser_suppressor = (1 - 0.3 * %AU22L) * (1 - 0.5 * %AU18L) * (1 - presser) * (1 - %biter) * (1 - left_corner_puller) * (1 - 0.5 * jaw_drop)

localvar left_nose right_nose

%AU9R = right_wrinkler * %right_raiser_suppressor * (1 - right_upper_raiser)
%AU9L = left_wrinkler * %left_raiser_suppressor * (1 - left_upper_raiser)
%AU10R = right_upper_raiser * %right_raiser_suppressor
%AU10L = left_upper_raiser * %left_raiser_suppressor
%AU25R = %AU25R * (1 - %AU10R) * (1 - %AU9R)
%AU25L = %AU25L * (1 - %AU10L) * (1 - %AU9L)

// chain raiser

%AU17R = chin_raiser * (1 - jaw_drop * 0.5) * (1 - %biter) * max( 0, (1 - 2 * (%AU25R + %AU12AU25R + %AU18R + %AU22R + %AU10R )))
%AU17L = chin_raiser * (1 - jaw_drop * 0.5) * (1 - %biter) * max( 0, (1 - 2 * (%AU25L + %AU12AU25L + %AU18L + %AU22L + %AU10L )))


localvar right_depressor_suppressor left_depressor_suppressor

%right_depressor_suppressor = (1 / (%AU18R * 0.8 + %AU22R * 0.8 + %AU17R + %biter + right_corner_puller + right_stretcher + right_corner_depressor))
%left_depressor_suppressor = (1 / (%AU18L * 0.8 + %AU22L * 0.8 + %AU17L + %biter + left_corner_puller + left_stretcher + left_corner_depressor))

%AU15R = right_corner_depressor * (right_corner_depressor * %right_depressor_suppressor)
%AU15L = left_corner_depressor * (left_corner_depressor * %left_depressor_suppressor)

localvar right_corner_suppressor left_corner_suppressor

%right_corner_suppressor = (1 / (%AU18R * 0.8 + %AU22R * 0.8 + %AU17R + %biter + right_corner_puller + right_stretcher + right_corner_depressor)) * (1 - jaw_drop * 0.25) 
%left_corner_suppressor = (1 / (%AU18L * 0.8 + %AU22L * 0.8 + %AU17L + %biter + left_corner_puller + left_stretcher + left_corner_depressor)) * (1 - jaw_drop * 0.25) 

%AU12R = right_corner_puller * (right_corner_puller * %right_corner_suppressor) * (1 - right_part)
%AU12L = left_corner_puller * (left_corner_puller * %left_corner_suppressor) * (1 - left_part)
%AU20R = right_stretcher * (right_stretcher * %right_corner_suppressor)
%AU20L = left_stretcher * (left_stretcher * %left_corner_suppressor)


localvar right_drop_suppressor left_drop_suppressor
localvar right_drop left_drop

%right_drop_suppressor = (1 / (0.5 * %right_open + right_mouth_drop)) * (1 - presser) * (1 - %biter)
%left_drop_suppressor = (1 / (0.5 * %left_open + left_mouth_drop )) * (1 - presser) * (1 - %biter)

%right_drop = right_mouth_drop * (right_mouth_drop * %right_drop_suppressor)
%left_drop = left_mouth_drop * (left_mouth_drop * %left_drop_suppressor)


localvar right_au_open left_au_open

%right_au_open = min( %AU18R + %AU25R + %AU12AU25R + 0.5 * %AU22R + %AU20R + %AU12R, 1 )
%left_au_open = min( %AU18L + %AU25L + %AU12AU25L + 0.5 * %AU22L + %AU20L + %AU12L, 1 )

%AU32 = bite
%AU24 = presser + (1 - presser) * tightener
%AU31 = jaw_clencher * (jaw_clencher / (jaw_clencher + min( jaw_drop, 1 )))
%AD96L = max( -mouth_sideways, 0 ) * (1 - 0.5 * %right_au_open) * (1 - %right_drop * jaw_drop * 0.25) * (1 - 0.5 * %biter)
%AD96R = max(  mouth_sideways, 0 ) * (1 - 0.5 * %left_au_open) * (1 - %right_drop * jaw_drop * 0.25) * (1 - 0.5 * %biter)
%AD30L = max( -jaw_sideways, 0 )
%AD30R = max( jaw_sideways, 0 )


localvar jaw_overage jaw_underage jaw_blend

// 0..1..2 -> 0..0..1
%jaw_overage = max( 0, (jaw_drop - 1 ) * (1 - presser) * (1 - %biter) * (1 - 0.5 * max( %right_au_open, %left_au_open ) ) )
// 0..1..2 -> 0..1..0
%jaw_underage = min( jaw_drop, 1 ) - %jaw_overage
%jaw_blend = (jaw_drop / (jaw_clencher + jaw_drop))

%AU26R = %jaw_underage * (1 - %right_drop ) * %jaw_blend
%AU26L = %jaw_underage * (1 - %left_drop ) * %jaw_blend
%AU27R = %jaw_underage * %right_drop * %jaw_blend
%AU27L = %jaw_underage * %left_drop * %jaw_blend
%AU26ZR = %jaw_overage * (1 - %right_drop ) * %jaw_blend
%AU26ZL = %jaw_overage * (1 - %left_drop ) * %jaw_blend
%AU27ZR = %jaw_overage * %right_drop * %jaw_blend
%AU27ZL = %jaw_overage * %left_drop * %jaw_blend

// fixup funneler overage
%AU22ZR = max( 0, %AU22R - 1 )
%AU22ZL = max( 0, %AU22L - 1 )
%AU22R = min( %AU22R, 1 ) - %AU22ZR
%AU22L = min( %AU22L, 1 ) - %AU22ZL

//%AU42 = half_closed

// lower lip, suppress with jaw open, and with mouth open
%AU16L = %lower_lip_active * %left_lip_suppressor * (1 - %left_au_open )
%AU16R = %lower_lip_active * %right_lip_suppressor * (1 - %right_au_open )


// set the mouth shader illumination to roughly how far the mouth is open
%mouth		= %AU27R * 0.5 + %AU27L * 0.5 + %AU27ZR * 0.5 + %AU27ZL * 0.5 + %AU26ZR * 0.35 + %AU26ZL * 0.35 \\
			+ %AU22R * 0.35 + %AU22L * 0.35 \\
			+ %AU18R * 0.25 + %AU18L * 0.25 + %AU25R * 0.35 + %AU25L * 0.35 + %AU32 * 0.5 \\
			+ %AU12AU25R * 0.5 + %AU12AU25L * 0.5 + %AU16L * 0.30 + %AU16R * 0.30 \\
			+ %AU10R * 0.5 + %AU10L * 0.5

%AU13R = right_cheek_puffer * max( 0, 1 - %mouth * 3 )
%AU13L = left_cheek_puffer * max( 0, 1 - %mouth * 3 )


I think its because the face flexes for the beta bill and other beta survivors differ from retail’s facial flexes.
The only other way I would think would fix them would be to completely rewrite the flex area or redo the face flexes (because the ones on it are already broken that splinks released)
Either that or wait for splinks to release the source files to the other survivors.

I’m using retail Bill, but only the head though.

are you using retail flexes as well?

I assume so, considering I picked these from the Valve starter packs that were dropped in the Community update. Are those the ones?

I was talking like the .VTA file wise, the flex commands are the valve official ones.

I used the VTA supplied in the pack. Namvet_shapes.vta

the one in the SMD folder is to the beta bill, the DMX is the one for retail (no idea if HL2 studiomdl can compile it)

I’m gonna try again tomorrow, wish me luck!

And thanks for the help so far, even if it was just questions, maybe I’ve missed something hah.

I figured out the problem and now he’s animating beautifully. Thanks for the help!

NoaJM but how? Explain, please!
I have changed the body of beta-Zoey, and I can’t compile it through “Crowbar”.

GUIstudiomdl dose not even work for me

This thread has been dead for a while, folks. There’s no point in bumping it.

Could an admin kindly lock this?

Katra804, but there’s no any explanation here! Seems I need to start the new thread?

There doesn’t need to be any explanations; they had a problem, and they managed to find the fix on their own. If you really want to know what they did, consider sending a PM (private message, in case you don’t know what PM means) instead of bumping dead threads.

As for making a new thread, that would probably be wiser than bumping dead threads.

Okay, I got it. I’ll send PM for him right now.

may i ask what you did to beta zoey?

uaredead2020 rigged to the new body. That’s all.