Hi
This tutorial is marked advanced because a lot of things will seem complex and/or alien to people who haven't compiled Source engine models before, and there are things unique to L4D2 viewmodels that other Source games don't do or do differently. Knowing how to compile to HL2 or CSS before this helps a lot (I made an unreleased CSS G3SG-1 re-anim before attempting L4D2 if you dig far back enough on my youtube channel).
Here's how I compile first-person models (viewmodels/v_model) to L4D2:
You need:
- GCFScape (open L4D2's pak##_dir.vpk and extract weapon models)
- Notepad++ (note the ++ plus plus)
- Weapon models and animations as smd files, scaled correctly for L4D2 ingame, preferably using the L4D2 arms skeleton.
- L4D2's studiomdl.exe (install L4D2 addon support and authoring tools)
- MDLDecompiler (Fixed version by Hooch will work)
Animation exported as smd you need:
idle (animated/fidgeting, preferably with the first and last frames as the "true" idle pose)
running while aiming
idle pose nudged over a bit, happens when aiming 90 degrees up position (1 frame)
idle pose nudged over a bit in a different position, happens when aiming 90 degrees down position (1 frame)
fire single shot
reload
melee attack/swing rifle butt/pistol whip/whatever
draw/equip/ready weapon
the smds I used in the tutorial images below are:
bash.smd - melee anim
default.smd - unused, the t-pose/a-pose/rest-pose
down.smd - aiming down pose
draw.smd - draw
fire.smd - fire
idle.smd - idle animated
pose.smd - idle pose 1 frame (not necessary if your idle anim is set up like I explained above)
reload.smd - reload
run.smd - run
up.smd - aim up
For idle aiming-up/down, I usually just move the root bone (to move all bones), to avoid posing problems when interpolating/blending with other anims. Remember, the weapon follows your camera, and you don't actually have to rotate the model pointing 90 degrees up, or 90 degrees down for these two poses, just nudge the weapon into a different position. Imagine the relative positions of the shoulders to the eyes/camera when aiming up/down.
We need to get some files from L4D2. Most of the weapons are gotten by opening pak01_dir.vpk with GCFScape. If the model appeared in one of the DLC's, they'll be in that DLC's pak01_dir.vpk. Decompile the weapon you want to replace, and hopefully get some of the qc file from it:
Hopefully you get a qc file like this:

If you get no qc, you should try a v_rifle (Assault Rifle / M16) replacement first, as I will post my own entire M16 QC. Almost all other weapons can be derived from that, once you know what else is below.
Next you need to consolidate your model smd files:

Edit the qc file to incorporate your smds and give it attachments for muzzleflash, flashlight/laser, and shell ejection:

How to use Model Viewer to set-up attachments:
Put the attachments in the same order as the original ones, order is how they're used by the game in certain ways, not always by name.
With the non-animation parts of the qc out of the way, we start creating the animation qc. Here is my v_rifle animation qc cheat sheet. I had to make this from mostly scratch and fill in all the blanks from what I saw in Model Viewer, the few anim qc lines that did decompile, and the last line of the mdl file. The hunting rifle is the most painful because of all the unused sequences. You can fill those in with duplicates of similar animations, or a motionless delta anim.
M16 QC FILE (my G36C mod)
$modelname "v_models\v_rifle.mdl"
$include "sharedbones.qci"
$origin -0.3 4.0 64.0
$body "v_g36" "v_g36c_arby26.smd"
$body "v_m16_case" "v_M16_casing.smd"
$cdmaterials "models\v_models\Weapons\arby26_g36c\"
$cdmaterials ""
$hboxset "default"
$hbox 0 "ValveBiped.Bip01" 0.000 0.000 -0.018 20.239 17.853 4.890
$attachment "attach_shell_eject" "g36c_all" -0.70 0.47 2.50 rotate -25 145 -180
$attachment "attach_muzzle" "g36c_all" -0.00 0.56 17.50 rotate -90 0 0
$attachment "muzzle_flash" "g36c_all" -0.00 0.56 17.50 rotate -90 0 0
$attachment "flashlight" "g36c_all" 0.00 -2.40 13.70 rotate -90 0 0
$attachment "shell" "g36c_all" -0.70 0.47 2.50 rotate -25 145 -180
$attachment "attach_camera" "ValveBiped.attach_camera" 0.00 0.00 0.00 rotate 0 0 0
$attachment "fowardnode" "g36c_trig" 0.00 0.00 0.00 rotate 0 -0 0
$include bonemerges.qci
$surfaceprop "default"
$illumposition 7.307 0.000 -31.193
$animation idle_delta "anims\pose.smd" fps 30.00
$animation look_down "anims\down.smd" fps 30.000000 subtract idle_delta 0
$animation look_mid "anims\pose.smd" fps 30.000000 subtract idle_delta 0
$animation look_up "anims\up.smd" fps 30.000000 subtract idle_delta 0
$sequence look_poses look_up fps 30.00 {
blendwidth 3
blend ver_aims -1.000000 1.000000
delta
look_mid look_down
}
$sequence idle_raw "anims\idle.smd" loop fps 30.00
$animation ta_trans_run "anims\run.smd" loop fps 40.000000
$animation ta_trans_idle "anims\idle.smd" fps 30.000000
$sequence idle "anims\run.smd" loop ACT_VM_IDLE 1 fps 40.00 {
blendwidth 3
blend move_x -0.500000 0.500000
ta_trans_idle ta_trans_run
addlayer look_poses
}
$sequence deploy "anims\draw.smd" ACT_VM_DEPLOY 1 fps 30.00
$sequence deploy_layer "anims\draw.smd" ACT_VM_DEPLOY_LAYER 1 fps 30.00 subtract idle_delta 0 {
delta
{ event 5004 1 "AK47.Deploy" }
{ event 5004 13 "Rifle.SlideBack" }
{ event 5004 18 "Rifle.SlideForward" }
}
$sequence fire "anims\fire.smd" ACT_VM_PRIMARYATTACK 1 snap fps 64.00 {
{ event AE_MUZZLEFLASH 0 "1" }
}
$sequence fire_layer "anims\fire.smd" ACT_VM_PRIMARYATTACK_LAYER 1 snap fps 64.00 subtract idle_delta 0 {
delta
{ event AE_MUZZLEFLASH 0 "1" }
//optional: { event AE_CL_CREATE_PARTICLE_BRASS 1 "weapon_shell_casing_rifle shell" } // weapon_shell_casing_[9mm,rifle,shotgun]
//procedural shell ejection, not a manually animated shell in fire anim.
}
$sequence reload "anims\reload.smd" ACT_VM_RELOAD 1 fps 30.00 {
}
$sequence reload_layer "anims\reload.smd" ACT_VM_RELOAD_LAYER 1 fps 30.00 subtract idle_delta 0 {
delta
{ event 5004 11 "Rifle.ClipOut" }
{ event 5004 27 "Rifle.ClipIn" }
{ event 5004 35 "Rifle.ClipLocked" }
{ event 5004 52 "Rifle.FullAutoButton" }
}
$sequence melee "anims\bash.smd" ACT_VM_MELEE 1 snap fps 30.00 {
}
$sequence melee_layer "anims\bash.smd" ACT_VM_MELEE_LAYER 1 snap fps 30.00 subtract idle_delta 0 {
delta
}
$sequence helping_hand_extend "anims\help_ext" ACT_VM_HELPINGHAND_EXTEND 1 fps 80.00 fadein 0.0 fadeout 0.0 {
}
$sequence helping_hand_extend _layer "anims\hr_help_ext" ACT_VM_HELPINGHAND_EXTEND_LAYER 1 fps 60.00 fadein 0.0 fadeout 0.0 {
{ event 5004 1 "Rifle.HelpingHandExtend" }
}
$sequence helping_hand_loop "anims\help_idle" loop ACT_VM_HELPINGHAND_LOOP 1 fadeout 0.0 fps 30.00
$sequence helping_hand_loop_layer "anims\help_idle" loop ACT_VM_HELPINGHAND_LOOP_LAYER 1 fadein 0.2 fadeout 0.2 fps 30.00 {
}
$sequence helping_hand_retract "anims\help_ret" ACT_VM_HELPINGHAND_RETRACT 1 fps 80.00 {
}
$sequence helping_hand_retract_layer "anims\help_ret" ACT_VM_HELPINGHAND_RETRACT_LAYER 1 fadein 0.0 fadeout 0.0 fps 45.00 {
{ event 5004 1 "Rifle.HelpingHandRetract" }
}
$sequence item_extend_extend "anims\help_ext" ACT_VM_ITEMPICKUP_EXTEND 1 fps 80.00 fadein 0.0 fadeout 0.0 {
}
$sequence item_extend_layer "anims\help_ext" ACT_VM_ITEMPICKUP_EXTEND_LAYER 1 fps 60.00 fadein 0.0 fadeout 0.0 {
{ event 5004 1 "Rifle.ItemPickupExtend" }
}
$sequence item_extend_loop "anims\help_idle" loop ACT_VM_ITEMPICKUP_LOOP 1 fadeout 0.0 fps 30.00
$sequence item_extend_loop_layer "anims\help_idle" loop ACT_VM_ITEMPICKUP_LOOP_LAYER 1 fps 30.00 fadein 0.2 fadeout 0.2 {
}
$sequence item_extend_retract "anims\help_ret" ACT_VM_ITEMPICKUP_RETRACT 1 fps 80.00 {
}
$sequence item_extend_retract_layer "anims\help_ret" ACT_VM_ITEMPICKUP_RETRACT_LAYER 1 fps 45.00 fadein 0.0 fadeout 0.0 {
{ event 5004 1 "Rifle.ItemPickupRetract" }
}
It's very important that the $sequence lines appear in order in the qc. If these are out of order, weird things happen online, such as different animations playing in the place of others and cutting off early.
Here's how to get the sequence order on models:

There is an alternative method of getting the order of the sequences.
This is the HARD WAY:

Order when writing the qc:

Since some qcs don't decompile fully or at all, this is the only way to know how to make the sequences for other weapons (the hunting rifle is the hardest, pistols have more sequences than most weapons with their visible slide positions).
You should now be finished with the qc and you are ready to compile.
Sometimes you need to compile and re-install over and over again to tweak your model. Here's the fast way to compile+install using bat files:

Here's what goes in the compile bat (fill in your folders/file locations)... You will need to create models\v_models\ before hand because studiomdl.exe never makes missing folders itself and will just error:
@"C:\Program Files (x86)\Steam\SteamApps\common\left 4 dead 2\bin\studiomdl.exe" -game "C:\[your compiled models folder, that contains a copy of the L4D2 gameinfo.txt]\" [name of your qc file].qc %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
Here's what goes in the install bat (fill in your folders/file locations)... you need an addoninfo.txt (info on Valve Developer Wiki) in the root folder of the mod folder that you'll be turning into a vpk file.
@copy "C:\[your compiled models folder]\models\v_models\v_rifle.mdl" "C:\[your mod folder]\models\v_models\"
@copy "C:\[your compiled models folder]\models\v_models\v_rifle.dx90.vtx" "C:\[your mod folder]\models\v_models\"
@copy "C:\[your compiled models folder]\models\v_models\v_rifle.vtx" "C:\[your mod folder]\models\v_models\"
@copy "C:\[your compiled models folder]\models\v_models\v_rifle.vvd" "C:\[your mod folder]\models\v_models\"
@"C:\Program Files (x86)\Steam\SteamApps\common\left 4 dead 2\bin\vpk.exe" "C:\[your mod folder]"
@copy "C:\[your mod folder].vpk" "C:\Program Files (x86)\Steam\SteamApps\common\left 4 dead 2\left4dead2\addons\"
@del "C:\[your mod folder].vpk"
pause
It copies your compiled model files from where they compiled to the folder you will create a vpk from.
After doing that, remember to look inside the new addon vpk in L4D2 and make sure your model files are there.
BELOW ARE THE OTHER QCI FILES EXPLAINED:
The arms change in L4D/L4D2 depending on what character you are playing as. They are an attachment to the current weapon model, an attachment that spans multiple animated bones. The arms bones exist in the weapon model and are animated there (or point to where the animations are in another mdl or mdl+ani... I never do this and only compile anims into the weapon mdl). Studiomdl.exe will delete bones it thinks are useless. To prevent this, we need to specify that the bones will be used for attachments ($bonemerge). We also need to put the bones in order ($definebone).
sharedbones.qci is used to put the L4D2 arms bones in order... you can get the same stuff from following the Valve Developer's wiki on $definebone, and I found the order in Model Viewer / last line of mdl file. I include this before the bonemerging.
Complete sharedbones.qci:
$definebone "ValveBiped.ValveBiped" "" 0.000000 -0.000000 0.000000 -0.000000 0.000000 89.999983 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
$definebone "ValveBiped.Bip01" "ValveBiped.ValveBiped" 0.000000 38.317692 -0.516773 0.253992 89.999983 89.999983 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000
$definebone "ValveBiped.Camera" "ValveBiped.ValveBiped" 0.000000 56.084805 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_bone" "ValveBiped.Bip01" 8.329033 7.655514 0.000000 -89.999983 -89.745989 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
$definebone "ValveBiped.attach_muzzle" "ValveBiped.weapon_bone" 0.000000 0.099716 8.360893 -89.999983 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000
$definebone "ValveBiped.attach_shell_eject" "ValveBiped.weapon_bone" 0.000000 3.003864 1.610714 -0.000000 89.999983 -89.999983 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000
$definebone "ValveBiped.attach_camera" "ValveBiped.Camera" 0.000000 0.000000 0.000000 -89.999983 -0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000
$definebone "ValveBiped.Bip01_Spine" "ValveBiped.Bip01" 4.044003 0.000000 0.000000 -0.000000 -4.512557 0.000000 0.000004 0.000000 0.000000 -0.000000 -0.000000 0.000000
$definebone "ValveBiped.Bip01_Spine1" "ValveBiped.Bip01_Spine" 3.995838 0.000000 -0.000000 -0.000000 -9.852983 0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000
$definebone "ValveBiped.Bip01_Spine2" "ValveBiped.Bip01_Spine1" 3.698242 0.000002 -0.000000 -0.000000 -0.906992 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000
$definebone "ValveBiped.Bip01_Spine4" "ValveBiped.Bip01_Spine2" 5.700890 0.000000 0.000000 -0.000000 28.371669 0.000000 0.000000 0.000001 -0.000000 -0.000000 -0.000000 0.000000
$definebone "ValveBiped.Bip01_L_Clavicle" "ValveBiped.Bip01_Spine4" 4.065392 1.458947 1.500000 -63.875281 -147.035752 50.277508 -0.000002 0.000000 0.000000 0.000002 0.000000 -0.000001
$definebone "ValveBiped.Bip01_L_UpperArm" "ValveBiped.Bip01_L_Clavicle" 5.507359 0.000004 -0.000001 -19.730434 -44.165479 -79.348296 0.000000 0.000000 0.000000 0.000002 -0.000001 0.000001
$definebone "ValveBiped.Bip01_L_Forearm" "ValveBiped.Bip01_L_UpperArm" 10.907398 -0.000000 0.000000 -0.000000 -7.202482 0.000000 0.000004 -0.000000 0.000000 -0.000000 -0.000002 0.000000
$definebone "ValveBiped.Bip01_L_Hand" "ValveBiped.Bip01_L_Forearm" 10.424324 -0.000008 -0.000031 6.507313 7.122666 78.669799 0.000002 0.000000 0.000000 -0.000003 0.000000 -0.000003
$definebone "ValveBiped.Bip01_L_Finger4" "ValveBiped.Bip01_L_Hand" 2.997269 0.005409 -1.477471 8.213346 -12.990158 11.742424 0.000000 0.000000 0.000000 -0.000003 -0.000002 0.000001
$definebone "ValveBiped.Bip01_L_Finger41" "ValveBiped.Bip01_L_Finger4" 1.510380 0.000002 0.000000 0.955233 -34.374601 0.653404 0.000000 -0.000000 0.000000 -0.000002 0.000002 0.000003
$definebone "ValveBiped.Bip01_L_Finger42" "ValveBiped.Bip01_L_Finger41" 0.808655 -0.000000 0.000000 -10.048536 -17.354258 -3.121069 0.000000 0.000001 0.000000 -0.000003 0.000005 0.000002
$definebone "ValveBiped.Bip01_L_Finger3" "ValveBiped.Bip01_L_Hand" 3.305799 0.203110 -0.546730 5.954118 -16.778210 11.337860 0.000000 0.000000 0.000000 -0.000003 -0.000001 0.000000
$definebone "ValveBiped.Bip01_L_Finger31" "ValveBiped.Bip01_L_Finger3" 1.807182 0.000000 0.000000 -5.063459 -30.512979 -2.977603 0.000000 -0.000000 0.000000 -0.000002 0.000003 0.000001
$definebone "ValveBiped.Bip01_L_Finger32" "ValveBiped.Bip01_L_Finger31" 0.966141 0.000002 0.000000 0.559033 -13.904478 0.138371 0.000000 -0.000000 0.000000 -0.000001 0.000007 0.000001
$definebone "ValveBiped.Bip01_L_Finger2" "ValveBiped.Bip01_L_Hand" 3.571508 0.109303 0.409580 3.893590 -14.791080 10.730296 0.000000 0.000000 -0.000000 -0.000003 -0.000001 -0.000001
$definebone "ValveBiped.Bip01_L_Finger21" "ValveBiped.Bip01_L_Finger2" 2.150654 0.000004 0.000000 -3.092658 -37.967168 -2.410834 0.000000 0.000000 0.000000 -0.000003 -0.000003 0.000001
$definebone "ValveBiped.Bip01_L_Finger22" "ValveBiped.Bip01_L_Finger21" 1.152744 -0.000002 0.000000 0.688635 -8.970347 0.108691 -0.000004 -0.000000 0.000000 -0.000004 -0.000002 0.000001
$definebone "ValveBiped.Bip01_L_Finger1" "ValveBiped.Bip01_L_Hand" 3.684095 -0.158701 1.419182 1.961117 -11.693728 10.352717 -0.000002 -0.000002 0.000000 -0.000003 -0.000001 -0.000001
$definebone "ValveBiped.Bip01_L_Finger11" "ValveBiped.Bip01_L_Finger1" 1.701012 0.000000 0.000000 3.669047 -38.756246 2.940822 0.000000 0.000000 0.000000 -0.000003 -0.000002 0.000001
$definebone "ValveBiped.Bip01_L_Finger12" "ValveBiped.Bip01_L_Finger11" 0.994709 -0.000001 0.000000 2.209323 -1.896548 0.073168 0.000000 0.000000 0.000000 -0.000003 0.000000 0.000001
$definebone "ValveBiped.Bip01_L_Finger0" "ValveBiped.Bip01_L_Hand" 1.068068 -1.287201 0.981905 -19.741837 -7.111211 97.051429 0.000000 0.000000 0.000000 -0.000003 0.000004 0.000000
$definebone "ValveBiped.Bip01_L_Finger01" "ValveBiped.Bip01_L_Finger0" 1.836304 0.000002 0.000000 -10.778427 -10.615990 0.000001 0.000002 0.000000 0.000002 -0.000003 0.000001 0.000001
$definebone "ValveBiped.Bip01_L_Finger02" "ValveBiped.Bip01_L_Finger01" 1.223946 0.000000 0.000000 -2.328848 11.249054 0.000000 -0.000002 0.000000 0.000000 -0.000003 0.000002 0.000000
$definebone "ValveBiped.Bip01_R_Clavicle" "ValveBiped.Bip01_Spine4" 4.065392 1.458947 -1.500000 63.875281 -147.035752 -54.583283 0.000002 0.000000 0.000000 -0.000002 0.000003 -0.000001
$definebone "ValveBiped.Bip01_R_UpperArm" "ValveBiped.Bip01_R_Clavicle" 5.507360 0.000004 0.000000 22.698469 -42.953728 82.695000 0.000000 0.000000 0.000000 0.000003 -0.000001 -0.000000
$definebone "ValveBiped.Bip01_R_Forearm" "ValveBiped.Bip01_R_UpperArm" 10.907391 -0.000001 0.000000 0.000003 -7.202482 -0.000000 -0.000004 0.000000 0.000000 0.000003 -0.000001 -0.000000
$definebone "ValveBiped.Bip01_R_Hand" "ValveBiped.Bip01_R_Forearm" 10.424303 -0.000004 0.000019 -6.507538 7.122609 -78.876979 0.000000 0.000000 0.000000 0.000002 0.000000 -0.000003
$definebone "ValveBiped.Bip01_R_Finger4" "ValveBiped.Bip01_R_Hand" 2.997292 0.000063 1.477481 -8.213406 -12.989928 -11.535190 0.000000 0.000002 0.000000 0.000001 -0.000002 0.000000
$definebone "ValveBiped.Bip01_R_Finger41" "ValveBiped.Bip01_R_Finger4" 1.510384 0.000000 -0.000000 -0.955234 -34.374611 -0.653401 0.000000 0.000000 0.000000 0.000002 -0.000009 0.000000
$definebone "ValveBiped.Bip01_R_Finger42" "ValveBiped.Bip01_R_Finger41" 0.808651 0.000001 0.000000 10.048533 -17.354271 3.121072 0.000000 0.000000 0.000000 -0.000001 -0.000007 -0.000002
$definebone "ValveBiped.Bip01_R_Finger3" "ValveBiped.Bip01_R_Hand" 3.305809 0.201132 0.547460 -5.954234 -16.777983 -11.130624 0.000000 0.000000 0.000000 0.000001 -0.000002 0.000000
$definebone "ValveBiped.Bip01_R_Finger31" "ValveBiped.Bip01_R_Finger3" 1.807178 -0.000002 -0.000000 5.063457 -30.512989 2.977604 0.000000 -0.000001 0.000000 0.000001 -0.000003 -0.000001
$definebone "ValveBiped.Bip01_R_Finger32" "ValveBiped.Bip01_R_Finger31" 0.966141 0.000000 -0.000000 -0.559035 -13.904483 -0.138371 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000001
$definebone "ValveBiped.Bip01_R_Finger2" "ValveBiped.Bip01_R_Hand" 3.571527 0.110786 -0.409183 -3.893706 -14.790906 -10.523117 -0.000004 0.000000 0.000000 0.000001 -0.000001 -0.000000
$definebone "ValveBiped.Bip01_R_Finger21" "ValveBiped.Bip01_R_Finger2" 2.150656 0.000000 0.000000 3.092655 -37.967171 2.410834 0.000000 0.000001 0.000000 0.000000 -0.000009 -0.000002
$definebone "ValveBiped.Bip01_R_Finger22" "ValveBiped.Bip01_R_Finger21" 1.152748 0.000001 0.000000 -0.688639 -8.970353 -0.108692 0.000000 -0.000001 0.000000 -0.000001 -0.000012 -0.000001
$definebone "ValveBiped.Bip01_R_Finger1" "ValveBiped.Bip01_R_Hand" 3.684114 -0.153570 -1.419747 -1.961176 -11.693500 -10.145480 0.000000 0.000000 0.000000 0.000001 -0.000003 -0.000000
$definebone "ValveBiped.Bip01_R_Finger11" "ValveBiped.Bip01_R_Finger1" 1.701021 -0.000002 0.000000 -3.669049 -38.756249 -2.940822 0.000000 -0.000001 -0.000000 0.000001 -0.000002 -0.000001
$definebone "ValveBiped.Bip01_R_Finger12" "ValveBiped.Bip01_R_Finger11" 0.994709 0.000002 0.000000 -2.209324 -1.896551 -0.073168 0.000000 -0.000000 -0.000000 0.000001 -0.000002 -0.000001
$definebone "ValveBiped.Bip01_R_Finger0" "ValveBiped.Bip01_R_Hand" 1.068096 -1.283653 -0.986552 19.767271 -7.037127 -96.832904 0.000000 0.000000 0.000000 -0.000000 0.000001 0.000001
$definebone "ValveBiped.Bip01_R_Finger01" "ValveBiped.Bip01_R_Finger0" 1.836304 0.000000 0.000000 10.778425 -10.615991 0.000001 0.000000 0.000001 -0.000002 0.000000 0.000001 0.000001
$definebone "ValveBiped.Bip01_R_Finger02" "ValveBiped.Bip01_R_Finger01" 1.223946 0.000000 0.000000 2.328844 11.249053 0.000002 0.000000 0.000000 0.000002 0.000000 -0.000000 0.000002
$definebone "ValveBiped.weapon_charger_slide" "ValveBiped.weapon_bone" 0.000000 1.945634 -1.740833 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000004 0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_stock_hammer" "ValveBiped.weapon_bone" 0.000000 0.000000 5.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_bolt" "ValveBiped.weapon_bone" 0.000000 0.000000 5.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_safety" "ValveBiped.weapon_bone" 0.000000 0.000000 5.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_trigger" "ValveBiped.weapon_bone" 0.000000 0.375470 1.570164 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_clip_realease" "ValveBiped.weapon_bone" 0.000000 0.000000 5.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_clip" "ValveBiped.weapon_bone" -0.000001 -0.000003 3.857136 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
$definebone "ValveBiped.weapon_clip_bullets_l" "" 0.000000 0.726000 3.497000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
$definebone "ValveBiped.Bip01_R_Forearm_driven" "ValveBiped.Bip01_R_Forearm" 3.201683 0.000000 0.000000 -6.000010 6.999995 -78.603505 0.000004 0.000000 -0.000000 0.000003 0.000002 0.000000
$definebone "ValveBiped.Bip01_R_Driven_ulna" "ValveBiped.Bip01_R_Forearm" 6.694328 -0.000000 -0.000004 -6.014681 7.006070 -79.112067 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000002
$definebone "ValveBiped.Bip01_R_thumbroot" "ValveBiped.Bip01_R_Hand" 0.109861 -0.821461 -0.906649 20.672263 -17.532109 -104.524524 0.000000 -0.000001 0.000000 -0.000000 0.000004 0.000001
$definebone "ValveBiped.Bip01_L_Forearm_driven" "ValveBiped.Bip01_L_Forearm" 3.358418 -0.030838 0.000027 6.000015 6.999996 78.518367 0.000000 0.000000 0.000000 0.000001 -0.000002 0.000001
$definebone "ValveBiped.Bip01_L_Driven_ulna" "ValveBiped.Bip01_L_Forearm" 6.868288 0.000000 0.000000 6.000015 6.999996 78.895830 0.000004 0.000000 0.000000 -0.000000 0.000000 0.000001
$definebone "ValveBiped.Bip01_L_thumbroot" "ValveBiped.Bip01_L_Hand" 0.084970 -0.692268 1.011117 26.000000 112.000000 -76.500000 0.000000 0.000002 0.000000 0.000003 0.000003 -0.000000
bonemerges.qci tells which bones receive attachments:
$bonemerge "ValveBiped.ValveBiped"
$bonemerge "ValveBiped.Bip01"
$bonemerge "ValveBiped.Camera"
$bonemerge "ValveBiped.weapon_bone"
$bonemerge "ValveBiped.attach_muzzle"
$bonemerge "ValveBiped.attach_shell_eject"
$bonemerge "ValveBiped.attach_camera"
$bonemerge "ValveBiped.Bip01_Spine"
$bonemerge "ValveBiped.Bip01_Spine1"
$bonemerge "ValveBiped.Bip01_Spine2"
$bonemerge "ValveBiped.Bip01_Spine4"
$bonemerge "ValveBiped.Bip01_L_Clavicle"
$bonemerge "ValveBiped.Bip01_L_UpperArm"
$bonemerge "ValveBiped.Bip01_L_Forearm"
$bonemerge "ValveBiped.Bip01_L_Hand"
$bonemerge "ValveBiped.Bip01_L_Finger4"
$bonemerge "ValveBiped.Bip01_L_Finger41"
$bonemerge "ValveBiped.Bip01_L_Finger42"
$bonemerge "ValveBiped.Bip01_L_Finger3"
$bonemerge "ValveBiped.Bip01_L_Finger31"
$bonemerge "ValveBiped.Bip01_L_Finger32"
$bonemerge "ValveBiped.Bip01_L_Finger2"
$bonemerge "ValveBiped.Bip01_L_Finger21"
$bonemerge "ValveBiped.Bip01_L_Finger22"
$bonemerge "ValveBiped.Bip01_L_Finger1"
$bonemerge "ValveBiped.Bip01_L_Finger11"
$bonemerge "ValveBiped.Bip01_L_Finger12"
$bonemerge "ValveBiped.Bip01_L_Finger0"
$bonemerge "ValveBiped.Bip01_L_Finger01"
$bonemerge "ValveBiped.Bip01_L_Finger02"
$bonemerge "ValveBiped.Bip01_R_Clavicle"
$bonemerge "ValveBiped.Bip01_R_UpperArm"
$bonemerge "ValveBiped.Bip01_R_Forearm"
$bonemerge "ValveBiped.Bip01_R_Hand"
$bonemerge "ValveBiped.Bip01_R_Finger4"
$bonemerge "ValveBiped.Bip01_R_Finger41"
$bonemerge "ValveBiped.Bip01_R_Finger42"
$bonemerge "ValveBiped.Bip01_R_Finger3"
$bonemerge "ValveBiped.Bip01_R_Finger31"
$bonemerge "ValveBiped.Bip01_R_Finger32"
$bonemerge "ValveBiped.Bip01_R_Finger2"
$bonemerge "ValveBiped.Bip01_R_Finger21"
$bonemerge "ValveBiped.Bip01_R_Finger22"
$bonemerge "ValveBiped.Bip01_R_Finger1"
$bonemerge "ValveBiped.Bip01_R_Finger11"
$bonemerge "ValveBiped.Bip01_R_Finger12"
$bonemerge "ValveBiped.Bip01_R_Finger0"
$bonemerge "ValveBiped.Bip01_R_Finger01"
$bonemerge "ValveBiped.Bip01_R_Finger02"
$bonemerge "ValveBiped.Bip01_R_Forearm_driven"
$bonemerge "ValveBiped.Bip01_R_Driven_ulna"
$bonemerge "ValveBiped.Bip01_R_thumbroot"
$bonemerge "ValveBiped.Bip01_L_Forearm_driven"
$bonemerge "ValveBiped.Bip01_L_Driven_ulna"
$bonemerge "ValveBiped.Bip01_L_thumbroot"
Sequences explained: There is some use of animation blending in the L4D viewmodels, mostly for the run animation and the aim-up/down posing.
The sequences for L4D(2) weapons are extremely cluttered. Some weapons (L4D1) have unused sequences, and all weapons have a non-layer and a layer sequences. The layer sequence is usually the real sequence that actually happens in game, while the other sequence is just there. Layer sequences are usually delta animations, but you also don't have to make a layer sequence a delta anim (adds ontop of current pose, rather than replaces the current pose) if you don't want to.
EXTRA:
You can still compile weapons that don't use the L4D2 arms, and include arms as part of the weapon model, that will be the same no matter what character you play as, CSS-style. Just remember to avoid the 128 bone limit. It's obviously recommended to decompile and animation-rig-up the L4D2 arms skeleton (it's the same for all characters. Decompile Ellis/Coach/Rochelle/Nick, because Valve included unused Bill/Louis/Francis/Zoey arms models, and rigging those on accident will waste a ton of time. You know you got the right skeleton if the forearm twist bones are called "...Forearm_driven" and "...Driven_ulna", and NOT "hlx_..." or "hlp_..."). Don't export the arms mesh with the weapon, just the bones and weapon mesh!



