Locking Npc Animations: Difference between revisions
|  (POV) | Thunder4ik (talk | contribs)  m (Unicodifying, replaced: [[Image: → [[File: (11)) | ||
| (10 intermediate revisions by 7 users not shown) | |||
| Line 1: | Line 1: | ||
| This is a quick guide to locking NPC animations for a custom model. As an example in this tutorial, we will use the Zombie Classic model. Only the decompiling process, locking the animations and recompiling will be covered. | |||
| {{note|When in-game, animations created using this tutorial might move awkwardly. This tutorial is not supposed to make them move perfectly, but rather demonstrate the process. To make it look ''right'', it will take some custom tweaking while [[Locking Npc Animations#Moving the root bone|moving the root bone]].}} | |||
| == Required tools == | |||
| * [[Goldsource]] / [[Source]] engine | |||
| * [http://developer.valvesoftware.com/wiki/Studiocompiler StudioCompiler] | |||
| {{warning|do not use Cannonfodders stand-alone .[[mdl]] decompiler, it has a bug in it affecting decompilation of this file.}} | |||
| * [[3DSMax]] / Cannonfodders 3DSMax .[[smd]] import/export plug-ins | |||
| * [[GCFScape]] | |||
| * [http://www.adobe.com/products/photoshop/main.html Adobe Photoshop] and [[VTF]] Import [[Photoshop VTF Plugin|plugin]] | |||
| to  | == Creating a decompile directory to store your .smd, .mdl and [[texture]] files == | ||
| # On your desktop or where-ever, create a directory called <code>decompile</code>. | |||
| # In your mod directory, open your <code>models</code> directory (if there isn't one, create it) and create a directory named <code>Zombie</code>. | |||
| # Back in your mod directory, open the directory <code>materials</code> and create a directory named <code>models</code>. Under that directory create another directory named <code>zombie_classic</code>. It should now look like <code>materials/models/zombie_classic</code>. | |||
| {{note|These directory names are case-sensitive. Please use the ones described here or you are likely to have problems further into the tutorial.}} | |||
| == Extracting the zombie model and its textures. == | |||
| # Open [[GCFScape]] | |||
| # Extract the zombie classic model found with GCFscape in <code>Program Files\Steam\SteamApps\source models</code> in the <code>decompile</code> directory. | |||
| # Next, extract the zombie textures found with GCFScape in <code>Program Files\Steam\SteamApps\source materials</code> in the <code>decompile</code> directory. | |||
| {{note|GCFScape will sometimes not open with [[Steam]] running in the background. If this happens, just close Steam.}} | |||
| {{note|For the Zombie texture location, look in GCFScape under <code>hl2/materials/Models/Zombie_Classic</code>.}} | |||
| == Opening the .VTF files with Photoshop and converting them to .TGA == | |||
| You need to change the zombie textures you just extracted into [[TGA|targas]] for viewing later on.  | |||
| # Launch Photoshop | |||
| # Navigate to <code>file</code> -> <code>open</code> | |||
| # Scroll to your <code>decompile</code> directory and select <code>Zombie_Classic_Sheet.vtf</code>.   | |||
| # Navigate to <code>file</code> -> <code>save as</code> and save the document as a .targa file in the <code>decompile</code> directory.  | |||
| # Repeat the process for the normal map texture. | |||
| {{note|Be sure NOT to load the .VMT file instead of the .VTF file.}} | |||
| == Decompiling the model == | |||
| [[File:decompile.jpg|thumb|50px|right]] | |||
| # Open Studio Compiler and select <code>Model Decompile</code>. | |||
| # Next, in the <code>choose model file</code> line, select the blue directory icon and open the <code>Classic.mdl</code> file that you extracted in your <code>decompile</code> directory. | |||
| # Under <code>choose output directory</code>, select the blue directory icon and browse to the <code>decompile</code> directory. | |||
| # Click the <code>extract</code> button to decompile your model. | |||
| {{note|You may have to type in the location of the model under <code>choose model file</code>.}} | |||
| [[File:smd.jpg|thumb|50px|right]] | |||
| You will notice in the directory you created (make sure you set studio compiler's <code>mdl decompile</code> to extract the files in the directory you just made) a bunch of files with the extension .smd and a text file with the extension .[[qc]]. It will be explained later — for now, we just need the .smd files. | |||
| == Using 3DSMax == | |||
| [[File:import.jpg|thumb|300px|right]] | |||
| {{note|Make sure you have installed Cannonfodders 3D Studio Max .smd import/export plug-ins into the 3DSMax plug-in directory.}} | |||
| # In 3DSMax, navigate to <code>File</code> -> <code>Import</code>. | |||
| # Select the .smd file type, navigate to the <code>decompile</code> directory and select the file <code>Zombie_reference.smd</code>. Click <code>Open</code>.  | |||
| # A window will pop up asking what you want to import. Check <code>import triangles</code>, <code>import skeleton</code>, <code>prompt for missing textures</code>, <code>rebuild smoothing groups</code> and click <code>OK</code>. | |||
| # Another window will pop up asking for the textures you extracted earlier. Under file type, select .targa. Navigate to the <code>decompile</code> directory and select the .targa file you created earlier. Load the file.  | |||
| {{note|Be sure not to load the normal map image file! Your model should look like [[:Image:max_view.jpg|this]].}} | |||
| Now you have your zombie model in the viewport. | |||
| == Loading animation files == | |||
| Now, for the part you all have been waiting for: how in the world do you lock the animations? | |||
| # Navigate to <code>File</code> -> <code>Import</code>, scroll to the <code>decompile</code> directory and select <code>a_walk1.smd</code>. | |||
| # This time when the Cannonfodders window pops up, uncheck all the boxes except <code>import skeleton</code>. You'll notice the figure change pose.  | |||
| # Scroll the time slider at the bottom to view the animation. You will notice that the model walks in one place, this is where the problem lies.  | |||
| {{note|If you happen to get a bone at the bottom of your model named <code>smd import</code>, delete it.}} | |||
| == Moving the root bone == | |||
| [[File:root.jpg|thumb|100px|right]] | |||
| [[File:auto.jpg|thumb|100px|right]] | |||
| [[File:root_move.jpg|thumb|100px|right]] | |||
| # Press F3 on your keyboard to view the wire frame. | |||
| # Zoom into the middle of the model's pelvis area and select the bone labeled <code>ValveBiped.Bip01_Pelvis</code>. | |||
| # To ensure we have selected the correct bone, select the move tool and move the bone around the screen. The entire model should move with the bone. If it does not, try to select the bone again until the model moves with the selected bone. | |||
| # Next, select all the time keys at the bottom of the screen. | |||
| # Delete all of them except the first one. | |||
| # Move your camera to the side of the model. | |||
| # Press the <code>auto key</code> button at the bottom of the screen. | |||
| # Move the time slider to the last key. | |||
| # Using the move tool, move the model a few feet forward by the root bone. | |||
| # Turn off <code>auto key</code>. | |||
| # Scroll the time slider back and forth to view the animation. The model should move back and forth, instead of in one place. | |||
| # Navigate to <code>File</code> -> <code>Export</code>. For file type select .smd. Scroll to the <code>decompile</code> directory and overwrite the existing file named <code>a_walk1.smd</code>. | |||
| # Now import the remaining walk files labeled <code>a_walk1.smd</code>, <code>a_walk2.smd</code>, <code>a_walkNE.smd</code>, <code>a_walkSW.smd</code>, etc. and repeat the process to them. Make sure you overwrite all the walk animations with the new ones.  | |||
| # After overwriting all the walk animations with new ones, close 3DSMax. | |||
| {{note|When working with animation files labeled with a SW, NW and so on at the end of them i.e. <code>a_walkSW.smd</code>, make sure you move the root bone into that direction. Example: move a walk animation labeled <code>A_walkNE.smd</code> into the north east direction, like so: [[:Image:nw_move1.jpg|before]], [[:Image:nw_move2.jpg|after]].}} | |||
| == Editing the .qc file == | |||
| [[ | [[File:qc1111.jpg|thumb|50px|right]] | ||
| [[File:qc2111.jpg|thumb|50px|right]] | |||
| ''' | # In Notepad or similar, navigate to the <code>decompile</code> directory and open the .qc file as shown in the picture. | ||
| # This step is the most important. We will now officially ''lock'' the animations. After every animation line, you have to add the text <code>LX LY</code>. | |||
| # Paste the following code in your .qc file and close it. | |||
| {{clr}} | |||
|  $cd "C:\Documents and Settings\Owner\Desktop\decompile" | |||
|  $modelname "Zombie/Classic.mdl" | |||
|  $model "studio" "Zombie_reference.smd" | |||
|  $poseparameter move_yaw -180.00 180.00 360.00 | |||
|  $cdmaterials "models\zombie_classic\" | |||
|  $cdmaterials "models\headcrab_classic\" | |||
|  $hboxset "default" | |||
|  $hbox 2 "ValveBiped.Bip01_Spine1" -8.500 -3.840 -7.120 15.500 9.840 7.730 | |||
|  $hbox 4 "ValveBiped.Bip01_L_UpperArm" -1.000 -3.500 -2.500 11.000 3.500 2.500 | |||
|  $hbox 4 "ValveBiped.Bip01_L_Forearm" -0.500 -1.860 -1.900 10.500 3.110 2.360 | |||
|  $hbox 4 "ValveBiped.Bip01_L_Hand" 0.000 -1.780 -1.000 6.000 1.230 2.000 | |||
|  $hbox 5 "ValveBiped.Bip01_R_UpperArm" -1.000 -3.500 -2.500 11.000 3.500 2.500 | |||
|  $hbox 5 "ValveBiped.Bip01_R_Forearm" -0.500 -1.890 -1.600 10.500 3.090 2.660 | |||
|  $hbox 5 "ValveBiped.Bip01_R_Hand" 0.000 -1.780 -2.500 6.000 1.230 0.500 | |||
|  $hbox 6 "ValveBiped.Bip01_L_Thigh" 0.000 -4.000 -3.730 17.250 4.000 4.290 | |||
|  $hbox 6 "ValveBiped.Bip01_L_Calf" 0.000 -4.870 -3.540 17.250 3.180 2.630 | |||
|  $hbox 6 "ValveBiped.Bip01_L_Foot" -1.500 -2.000 -2.500 7.500 2.000 2.500 | |||
|  $hbox 7 "ValveBiped.Bip01_R_Thigh" 0.000 -4.000 -3.730 17.250 4.000 4.290 | |||
|  $hbox 7 "ValveBiped.Bip01_R_Calf" 0.000 -4.920 -3.120 17.250 3.250 2.650 | |||
|  $hbox 7 "ValveBiped.Bip01_R_Foot" -1.500 -2.000 -2.500 7.500 2.000 2.500 | |||
|  $hbox 1 "ValveBiped.HC_Body_Bone" -6.590 -5.000 -5.760 8.500 5.000 6.240 | |||
|  // Model uses material "Zombie_Classic_sheet.vmt" | |||
|  // Model uses material "headcrabsheet.vmt" | |||
|  $attachment "headcrab" "ValveBiped.HC_Body_Bone" -4.49 -1.32 -0.02 rotate -0.00 20.25 29.25 | |||
|  $attachment "eyes" "ValveBiped.HC_Body_Bone" 0.00 0.00 0.00 rotate -0.00 0.00 -50.00 | |||
|  $attachment "head" "ValveBiped.HC_Body_Bone" 0.00 0.00 0.00 rotate -0.00 0.00 -50.00 | |||
|  $attachment "chest" "ValveBiped.Bip01_Spine4" -3.00 6.00 0.00 rotate 0.00 60.00 90.00 | |||
|  $attachment "maw" "ValveBiped.Bip01_Spine2" -0.00 8.00 0.00 rotate 0.00 90.00 90.00 | |||
|  $attachment "Blood_Left" "ValveBiped.Bip01_L_Finger2" -0.00 -0.00 0.00 rotate -0.00 -0.00 0.00 | |||
|  $attachment "Blood_Right" "ValveBiped.Bip01_R_Finger2" -0.00 -0.00 0.00 rotate 0.00 -0.00 0.00 | |||
|  $surfaceprop "zombieflesh" | |||
|  $eyeposition 0.000 0.000 64.000 | |||
|  $illumposition 6.562 -2.972 31.757 | |||
|  $sequence Idle01 "Idle01" loop ACT_IDLE 1 fps 30.00  | |||
|  $animation a_WalkS "a_WalkS" loop fps 24.000000 LX LY  | |||
|  $animation a_WalkSE "a_WalkSE" loop fps 24.000000 LX LY  | |||
|  $animation a_WalkE "a_WalkE" loop fps 24.000000 LX LY  | |||
|  $animation a_WalkNE "a_WalkNE" loop fps 24.000000 LX LY  | |||
|  $animation a_walk1 "a_walk1" loop fps 24.000000 LX LY  | |||
|  $animation a_WalkNW "a_WalkNW" loop fps 24.000000 LX LY  | |||
|  $animation a_WalkW "a_WalkW" loop fps 24.000000 LX LY  | |||
|  $animation a_WalkSW "a_WalkSW" loop fps 24.000000 LX LY  | |||
|  $sequence walk "a_WalkS" loop ACT_WALK 1 fps 24.00 { | |||
|  { event AE_ZOMBIE_STEP_LEFT 5 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 15 } | |||
|  { event AE_ZOMBIE_SCUFF_LEFT 20 } | |||
|  { event AE_ZOMBIE_STEP_LEFT 28 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 38 } | |||
|  { event AE_ZOMBIE_SCUFF_LEFT 40 } | |||
|  blendwidth 9 | |||
|  blend move_yaw -180.000000 180.000000 | |||
|  a_WalkSE a_WalkE a_WalkNE a_walk1 a_WalkNW a_WalkW a_WalkSW a_WalkS | |||
|  } | |||
|  $animation a_walk2 "a_walk2" loop fps 24.000000  | |||
|  $sequence walk2 "a_WalkS" loop ACT_WALK 1 fps 24.00 { | |||
|  { event AE_ZOMBIE_STEP_LEFT 7 } | |||
|  { event AE_ZOMBIE_SCUFF_RIGHT 10 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 21 } | |||
|  { event AE_ZOMBIE_STEP_LEFT 31 } | |||
|  { event AE_ZOMBIE_SCUFF_RIGHT 34 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 44 } | |||
|  blendwidth 9 | |||
|  blend move_yaw -180.000000 180.000000 | |||
|  a_WalkSE a_WalkE a_WalkNE a_walk2 a_WalkNW a_WalkW a_WalkSW a_WalkS | |||
|  } | |||
|  $animation a_walk3 "a_walk3" loop fps 24.000000 LX LY  | |||
|  $sequence walk3 "a_WalkS" loop ACT_WALK 1 fps 24.00 { | |||
|  { event AE_ZOMBIE_STEP_LEFT 7 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 18 } | |||
|  { event AE_ZOMBIE_SCUFF_LEFT 21 } | |||
|  { event AE_ZOMBIE_STEP_LEFT 32 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 40 } | |||
|  { event AE_ZOMBIE_SCUFF_LEFT 44 } | |||
|  blendwidth 9 | |||
|  blend move_yaw -180.000000 180.000000 | |||
|  a_WalkSE a_WalkE a_WalkNE a_walk3 a_WalkNW a_WalkW a_WalkSW a_WalkS | |||
|  } | |||
|  $animation a_Walk4 "a_Walk4" loop fps 24.000000 LX LY  | |||
|  $sequence walk4 "a_Walk4" loop ACT_WALK 1 fps 24.00 { | |||
|  { event AE_ZOMBIE_STEP_LEFT 4 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 16 } | |||
|  { event AE_ZOMBIE_STEP_LEFT 22 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 28 } | |||
|  { event AE_ZOMBIE_STEP_LEFT 43 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 49 } | |||
|  { event AE_ZOMBIE_STEP_LEFT 58 } | |||
|  { event AE_ZOMBIE_STEP_RIGHT 67 } | |||
|  } | |||
|  $sequence FireWalk "FireWalk" loop ACT_WALK_ON_FIRE 1 fps 30.00  | |||
|  $sequence FireIdle "FireIdle" loop ACT_IDLE_ON_FIRE 1 fps 30.00  | |||
|  $sequence attackA "attackA" ACT_MELEE_ATTACK1 2 fps 30.00 { | |||
|  { event AE_ZOMBIE_ATTACK_SCREAM 5 } | |||
|  { event AE_ZOMBIE_ATTACK_RIGHT 25 } | |||
|  } | |||
|  $sequence attackB "attackB" ACT_MELEE_ATTACK1 2 fps 30.00 { | |||
|  { event AE_ZOMBIE_ATTACK_SCREAM 5 } | |||
|  { event AE_ZOMBIE_ATTACK_RIGHT 25 } | |||
|  } | |||
|  $sequence attackC "attackC" ACT_MELEE_ATTACK1 2 fps 30.00 { | |||
|  { event AE_ZOMBIE_ATTACK_SCREAM 5 } | |||
|  { event AE_ZOMBIE_ATTACK_LEFT 25 } | |||
|  } | |||
|  $sequence attackD "attackD" ACT_MELEE_ATTACK1 2 fps 30.00 { | |||
|  { event AE_ZOMBIE_ATTACK_SCREAM 5 } | |||
|  { event AE_ZOMBIE_ATTACK_LEFT 25 } | |||
|  } | |||
|  $sequence attackE "attackE" ACT_MELEE_ATTACK1 2 fps 30.00 { | |||
|  { event AE_ZOMBIE_ATTACK_SCREAM 5 } | |||
|  { event AE_ZOMBIE_ATTACK_BOTH 25 } | |||
|  } | |||
|  $sequence attackF "attackF" ACT_MELEE_ATTACK1 2 fps 30.00 { | |||
|  { event AE_ZOMBIE_ATTACK_SCREAM 5 } | |||
|  { event AE_ZOMBIE_ATTACK_BOTH 25 } | |||
|  } | |||
|  $sequence swatleftmid "swatleftmid" ACT_ZOM_SWATLEFTMID 1 fps 30.00 { | |||
|  { event AE_ZOMBIE_STARTSWAT 1 } | |||
|  { event AE_ZOMBIE_SWATITEM 9 } | |||
|  } | |||
|  $sequence swatrightmid "swatrightmid" ACT_ZOM_SWATRIGHTMID 1 fps 30.00 { | |||
|  { event AE_ZOMBIE_STARTSWAT 1 } | |||
|  { event AE_ZOMBIE_SWATITEM 9 } | |||
|  } | |||
|  $sequence swatleftlow "swatleftlow" ACT_ZOM_SWATLEFTLOW 1 fps 30.00 { | |||
|  { event AE_ZOMBIE_STARTSWAT 1 } | |||
|  { event AE_ZOMBIE_SWATITEM 15 } | |||
|  } | |||
|  $sequence swatrightlow "swatrightlow" ACT_ZOM_SWATRIGHTLOW 1 fps 30.00 { | |||
|  { event AE_ZOMBIE_STARTSWAT 1 } | |||
|  { event AE_ZOMBIE_SWATITEM 18 } | |||
|  } | |||
|  $sequence releasecrab "releasecrab" ACT_ZOM_RELEASECRAB 1 fps 30.00 | |||
|  $sequence physflinch1 "physflinch1" ACT_FLINCH_PHYSICS 1 fps 30.00 | |||
|  $sequence physflinch2 "physflinch2" ACT_FLINCH_PHYSICS 1 fps 30.00 | |||
|  $sequence physflinch3 "physflinch3" ACT_FLINCH_PHYSICS 1 fps 30.00 | |||
|  $sequence smashfall64 "smashfall64" fps 30.00 { | |||
|  { event AE_NPC_BODYDROP_HEAVY 10 } | |||
|  { event AE_NPC_BODYDROP_HEAVY 27 } | |||
|  { event AE_NPC_BODYDROP_HEAVY 37 } | |||
|  { event AE_ZOMBIE_GET_UP 75 } | |||
|  } | |||
|  $sequence slump_a "slump_a" loop fps 30.00 | |||
|  $sequence slumprise_a "slumprise_a" fps 30.00 { | |||
|  { event AE_NPC_LEFTFOOT 15 } | |||
|  { event AE_NPC_RIGHTFOOT 50 } | |||
|  { event AE_ZOMBIE_GET_UP 80 } | |||
|  } | |||
|  $sequence slumprise_a_attack "slumprise_a_attack" fps 30.00 { | |||
|  { event AE_NPC_LEFTFOOT 15 } | |||
|  { event AE_NPC_RIGHTFOOT 50 } | |||
|  { event AE_ZOMBIE_GET_UP 80 } | |||
|  { event AE_ZOMBIE_ATTACK_SCREAM 16 } | |||
|  { event AE_ZOMBIE_ATTACK_RIGHT 36 } | |||
|  } | |||
|  $sequence slumprise_a2 "slumprise_a2" fps 30.00 { | |||
|  { event AE_NPC_RIGHTFOOT 16 } | |||
|  { event AE_NPC_RIGHTFOOT 22 } | |||
|  { event AE_ZOMBIE_GET_UP 24 } | |||
|  } | |||
|  $sequence slump_b "slump_b" loop fps 30.00 | |||
|  $sequence slumprise_b "slumprise_b" fps 30.00 { | |||
|  { event AE_NPC_LEFTFOOT 13 } | |||
|  { event AE_NPC_RIGHTFOOT 27 } | |||
|  { event AE_ZOMBIE_GET_UP 57 } | |||
|  } | |||
|  $sequence Breakthrough "Breakthrough" fps 30.00 | |||
|  $sequence canal5await "canal5await" fps 30.00 | |||
|  $sequence canal5aattack "canal5aattack" fps 30.00 | |||
|  $animation mdldecompiler_delta.smd "mdldecompiler_delta.smd" fps 30 | |||
|  $sequence flinch1inDelta "flinch1inDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch1inFrame "flinch1inFrame" fps 30.00 | |||
|  $sequence flinch1CoreDelta "flinch1CoreDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch1OutFrame "flinch1OutFrame" fps 30.00 | |||
|  $sequence flinch1outDelta "flinch1outDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch1 "flinch1" ACT_GESTURE_FLINCH_HEAD 1 fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch2inDelta "flinch2inDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch2inFrame "flinch2inFrame" fps 30.00 | |||
|  $sequence flinch2CoreDelta "flinch2CoreDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch2OutFrame "flinch2OutFrame" fps 30.00 | |||
|  $sequence flinch2outDelta "flinch2outDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch2 "flinch2" ACT_GESTURE_FLINCH_HEAD 1 fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch3inDelta "flinch3inDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch3inFrame "flinch3inFrame" fps 30.00 | |||
|  $sequence flinch3CoreDelta "flinch3CoreDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch3OutFrame "flinch3OutFrame" fps 30.00 | |||
|  $sequence flinch3outDelta "flinch3outDelta" fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence flinch3 "flinch3" ACT_GESTURE_FLINCH_HEAD 1 fps 30.00 subtract mdldecompiler_delta.smd 0 | |||
|  $sequence Tantrum "Tantrum" loop ACT_ZOMBIE_TANTRUM 1 fps 30.00 | |||
|  $sequence WallPound "WallPound" loop ACT_ZOMBIE_WALLPOUND 1 fps 30.00 { | |||
|  { event AE_ZOMBIE_POUND 14 } | |||
|  { event AE_ZOMBIE_POUND 35 } | |||
|  } | |||
|  $sequence ragdoll "ragdoll" ACT_DIERAGDOLL 1 fps 30.00 | |||
|  $ikchain rhand ValveBiped.Bip01_R_Hand knee 0.640 0.769 0.000 | |||
|  $ikchain lhand ValveBiped.Bip01_L_Hand knee 0.607 0.795 0.000 | |||
|  $ikchain rfoot ValveBiped.Bip01_R_Foot knee 0.545 -0.838 0.000 | |||
|  $ikchain lfoot ValveBiped.Bip01_L_Foot knee 0.518 -0.855 -0.000 | |||
|  $collisionjoints "phymodel.smd" { | |||
|  $mass 100.0 | |||
|  $inertia 10.00 | |||
|  $damping 0.10 | |||
|  $rotdamping 3.00 | |||
|  $rootbone "valvebiped.bip01_pelvis" | |||
|  $jointmerge "ValveBiped.Bip01_Pelvis" "ValveBiped.Bip01_Spine1" | |||
|  $jointconstrain "valvebiped.bip01_spine2" x limit -44.00 44.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_spine2" y limit -39.00 39.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_spine2" z limit -32.00 50.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_clavicle" x limit -30.00 30.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_clavicle" y limit -46.00 46.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_clavicle" z limit -26.00 48.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_upperarm" x limit -39.00 39.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_upperarm" y limit -79.00 95.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_upperarm" z limit -93.00 28.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_clavicle" x limit -30.00 30.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_clavicle" y limit -46.00 46.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_clavicle" z limit -26.00 48.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_upperarm" x limit -30.00 30.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_upperarm" y limit -95.00 84.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_upperarm" z limit -86.00 26.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_forearm" x limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_forearm" y limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_forearm" z limit -149.00 4.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_hand" x limit -55.00 55.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_hand" y limit -55.00 55.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_hand" z limit -55.00 55.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_forearm" x limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_forearm" y limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_forearm" z limit -149.00 4.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_thigh" x limit -12.00 12.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_thigh" y limit -8.00 75.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_thigh" z limit -97.00 32.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_calf" x limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_calf" y limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_calf" z limit -12.00 126.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_foot" x limit 0.00 0.00 0.00 | |||
|  $jointconstrain "valvebiped.bip01_r_foot" y limit -25.00 6.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_foot" z limit -15.00 35.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_thigh" x limit -12.00 12.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_thigh" y limit -73.00 6.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_thigh" z limit -93.00 30.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_calf" x limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_calf" y limit 0.00 0.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_calf" z limit -8.00 126.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_foot" x limit 0.00 0.00 0.00 | |||
|  $jointconstrain "valvebiped.bip01_l_foot" y limit -19.00 19.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_l_foot" z limit -15.00 35.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_hand" x limit -55.00 55.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_hand" y limit -55.00 55.00 0.20 | |||
|  $jointconstrain "valvebiped.bip01_r_hand" z limit -55.00 55.00 0.20 | |||
|  } | |||
| == Recompiling the model and textures == | |||
| [[File:compile_texts.jpg|thumb|70px|right]] | |||
| [[File:compile.jpg|thumb|70px|right]] | |||
| # Launch Studio Compiler | |||
| # Select <code>Material Compile</code> | |||
| # Check all the boxes as seen in the picture. | |||
| # Under <code>Materials</code> click <code>Add</code> and select the .targa images we made in Photoshop earlier. | |||
| # Under <code>TGA for normal map</code> select the normal map texture in <code>decompile</code>. | |||
| # Under <code>compiled material directory</code> type <code>zombie_classic</code>. | |||
| # Click the <code>Compile</code> button, once completed move to the next step. | |||
| # Select <code>Model Compile</code>, then select <code>Compile with existing qc</code>. | |||
| # Select the blue directory icon next to the qc file space. | |||
| # Navigate to your <code>decompile</code> directory and select the .qc file you just edited. | |||
| # Press the <code>compile</code> icon. | |||
| # Studio Compiler then begins to process your .smd files.  | |||
| # Your models have now been recompiled to their appropriate directories. | |||
| # Once you are finished, close studio compiler. | |||
| == Testing your model == | |||
| Congratulations! You've just completed your first NPC with locked animations. The easiest way to view your models is to make a shortcut to model viewer on your desktop and drag the files onto it. | |||
| [[File:viewer.jpg|thumb|200px|right]] | |||
| # Navigate to your Source SDK binary directory at <code>...\Steam\SteamApps\yourname\sourcesdk\bin</code>. | |||
| # Select the program named <code>[[HLMV|hlmv]]</code> and right click on it. | |||
| # Select <code>Send to</code> and click <code>Desktop (create shortcut)</code>. A shortcut is now on your desktop. | |||
| # Navigate to your <code>models</code> directory in your mod's directory. | |||
| # Open the <code>Zombie</code> directory. | |||
| # Select the model <code>Classic</code> and drag it onto the <code>hlmv</code> shortcut. The model viewer opens.  | |||
| # Under the <code>Render</code> tab, select the <code>Ground</code> checkbox. | |||
| # Select the <code>Sequence</code> tab and select the <code>walk</code> animation. | |||
| # The ground underneath the model should now move, which means that the model will change position in game. | |||
| {{clr}} | |||
| For further assistance, feel free to contact original author [[User:Microbeast|Frederick Ellis]] at {{e|fe029@operamail.com}}. | |||
| [[Category:Tutorials]] | |||
| [[Category:Modeling]] | |||
| [[ | |||
| [[ | |||
Latest revision as of 00:14, 7 January 2024
This is a quick guide to locking NPC animations for a custom model. As an example in this tutorial, we will use the Zombie Classic model. Only the decompiling process, locking the animations and recompiling will be covered.
 Note:When in-game, animations created using this tutorial might move awkwardly. This tutorial is not supposed to make them move perfectly, but rather demonstrate the process. To make it look right, it will take some custom tweaking while moving the root bone.
Note:When in-game, animations created using this tutorial might move awkwardly. This tutorial is not supposed to make them move perfectly, but rather demonstrate the process. To make it look right, it will take some custom tweaking while moving the root bone.Required tools
- Goldsource / Source engine
- StudioCompiler
 Warning:do not use Cannonfodders stand-alone .mdl decompiler, it has a bug in it affecting decompilation of this file.
Warning:do not use Cannonfodders stand-alone .mdl decompiler, it has a bug in it affecting decompilation of this file.- 3DSMax / Cannonfodders 3DSMax .smd import/export plug-ins
- GCFScape
- Adobe Photoshop and VTF Import plugin
Creating a decompile directory to store your .smd, .mdl and texture files
- On your desktop or where-ever, create a directory called decompile.
- In your mod directory, open your modelsdirectory (if there isn't one, create it) and create a directory namedZombie.
- Back in your mod directory, open the directory materialsand create a directory namedmodels. Under that directory create another directory namedzombie_classic. It should now look likematerials/models/zombie_classic.
 Note:These directory names are case-sensitive. Please use the ones described here or you are likely to have problems further into the tutorial.
Note:These directory names are case-sensitive. Please use the ones described here or you are likely to have problems further into the tutorial.Extracting the zombie model and its textures.
- Open GCFScape
- Extract the zombie classic model found with GCFscape in Program Files\Steam\SteamApps\source modelsin thedecompiledirectory.
- Next, extract the zombie textures found with GCFScape in Program Files\Steam\SteamApps\source materialsin thedecompiledirectory.
 Note:GCFScape will sometimes not open with Steam running in the background. If this happens, just close Steam.
Note:GCFScape will sometimes not open with Steam running in the background. If this happens, just close Steam. Note:For the Zombie texture location, look in GCFScape under
Note:For the Zombie texture location, look in GCFScape under hl2/materials/Models/Zombie_Classic.Opening the .VTF files with Photoshop and converting them to .TGA
You need to change the zombie textures you just extracted into targas for viewing later on.
- Launch Photoshop
- Navigate to file->open
- Scroll to your decompiledirectory and selectZombie_Classic_Sheet.vtf.
- Navigate to file->save asand save the document as a .targa file in thedecompiledirectory.
- Repeat the process for the normal map texture.
 Note:Be sure NOT to load the .VMT file instead of the .VTF file.
Note:Be sure NOT to load the .VMT file instead of the .VTF file.Decompiling the model
- Open Studio Compiler and select Model Decompile.
- Next, in the choose model fileline, select the blue directory icon and open theClassic.mdlfile that you extracted in yourdecompiledirectory.
- Under choose output directory, select the blue directory icon and browse to thedecompiledirectory.
- Click the extractbutton to decompile your model.
 Note:You may have to type in the location of the model under
Note:You may have to type in the location of the model under choose model file.You will notice in the directory you created (make sure you set studio compiler's mdl decompile to extract the files in the directory you just made) a bunch of files with the extension .smd and a text file with the extension .qc. It will be explained later — for now, we just need the .smd files.
Using 3DSMax
 Note:Make sure you have installed Cannonfodders 3D Studio Max .smd import/export plug-ins into the 3DSMax plug-in directory.
Note:Make sure you have installed Cannonfodders 3D Studio Max .smd import/export plug-ins into the 3DSMax plug-in directory.- In 3DSMax, navigate to File->Import.
- Select the .smd file type, navigate to the decompiledirectory and select the fileZombie_reference.smd. ClickOpen.
- A window will pop up asking what you want to import. Check import triangles,import skeleton,prompt for missing textures,rebuild smoothing groupsand clickOK.
- Another window will pop up asking for the textures you extracted earlier. Under file type, select .targa. Navigate to the decompiledirectory and select the .targa file you created earlier. Load the file.
 Note:Be sure not to load the normal map image file! Your model should look like this.
Note:Be sure not to load the normal map image file! Your model should look like this.Now you have your zombie model in the viewport.
Loading animation files
Now, for the part you all have been waiting for: how in the world do you lock the animations?
- Navigate to File->Import, scroll to thedecompiledirectory and selecta_walk1.smd.
- This time when the Cannonfodders window pops up, uncheck all the boxes except import skeleton. You'll notice the figure change pose.
- Scroll the time slider at the bottom to view the animation. You will notice that the model walks in one place, this is where the problem lies.
 Note:If you happen to get a bone at the bottom of your model named
Note:If you happen to get a bone at the bottom of your model named smd import, delete it.Moving the root bone
- Press F3 on your keyboard to view the wire frame.
- Zoom into the middle of the model's pelvis area and select the bone labeled ValveBiped.Bip01_Pelvis.
- To ensure we have selected the correct bone, select the move tool and move the bone around the screen. The entire model should move with the bone. If it does not, try to select the bone again until the model moves with the selected bone.
- Next, select all the time keys at the bottom of the screen.
- Delete all of them except the first one.
- Move your camera to the side of the model.
- Press the auto keybutton at the bottom of the screen.
- Move the time slider to the last key.
- Using the move tool, move the model a few feet forward by the root bone.
- Turn off auto key.
- Scroll the time slider back and forth to view the animation. The model should move back and forth, instead of in one place.
- Navigate to File->Export. For file type select .smd. Scroll to thedecompiledirectory and overwrite the existing file nameda_walk1.smd.
- Now import the remaining walk files labeled a_walk1.smd,a_walk2.smd,a_walkNE.smd,a_walkSW.smd, etc. and repeat the process to them. Make sure you overwrite all the walk animations with the new ones.
- After overwriting all the walk animations with new ones, close 3DSMax.
 Note:When working with animation files labeled with a SW, NW and so on at the end of them i.e.
Note:When working with animation files labeled with a SW, NW and so on at the end of them i.e. a_walkSW.smd, make sure you move the root bone into that direction. Example: move a walk animation labeled A_walkNE.smd into the north east direction, like so: before, after.Editing the .qc file
- In Notepad or similar, navigate to the decompiledirectory and open the .qc file as shown in the picture.
- This step is the most important. We will now officially lock the animations. After every animation line, you have to add the text LX LY.
- Paste the following code in your .qc file and close it.
$cd "C:\Documents and Settings\Owner\Desktop\decompile"
$modelname "Zombie/Classic.mdl"
$model "studio" "Zombie_reference.smd"
$poseparameter move_yaw -180.00 180.00 360.00
$cdmaterials "models\zombie_classic\"
$cdmaterials "models\headcrab_classic\"
$hboxset "default"
$hbox 2 "ValveBiped.Bip01_Spine1" -8.500 -3.840 -7.120 15.500 9.840 7.730
$hbox 4 "ValveBiped.Bip01_L_UpperArm" -1.000 -3.500 -2.500 11.000 3.500 2.500
$hbox 4 "ValveBiped.Bip01_L_Forearm" -0.500 -1.860 -1.900 10.500 3.110 2.360
$hbox 4 "ValveBiped.Bip01_L_Hand" 0.000 -1.780 -1.000 6.000 1.230 2.000
$hbox 5 "ValveBiped.Bip01_R_UpperArm" -1.000 -3.500 -2.500 11.000 3.500 2.500
$hbox 5 "ValveBiped.Bip01_R_Forearm" -0.500 -1.890 -1.600 10.500 3.090 2.660
$hbox 5 "ValveBiped.Bip01_R_Hand" 0.000 -1.780 -2.500 6.000 1.230 0.500
$hbox 6 "ValveBiped.Bip01_L_Thigh" 0.000 -4.000 -3.730 17.250 4.000 4.290
$hbox 6 "ValveBiped.Bip01_L_Calf" 0.000 -4.870 -3.540 17.250 3.180 2.630
$hbox 6 "ValveBiped.Bip01_L_Foot" -1.500 -2.000 -2.500 7.500 2.000 2.500
$hbox 7 "ValveBiped.Bip01_R_Thigh" 0.000 -4.000 -3.730 17.250 4.000 4.290
$hbox 7 "ValveBiped.Bip01_R_Calf" 0.000 -4.920 -3.120 17.250 3.250 2.650
$hbox 7 "ValveBiped.Bip01_R_Foot" -1.500 -2.000 -2.500 7.500 2.000 2.500
$hbox 1 "ValveBiped.HC_Body_Bone" -6.590 -5.000 -5.760 8.500 5.000 6.240
// Model uses material "Zombie_Classic_sheet.vmt"
// Model uses material "headcrabsheet.vmt"
$attachment "headcrab" "ValveBiped.HC_Body_Bone" -4.49 -1.32 -0.02 rotate -0.00 20.25 29.25
$attachment "eyes" "ValveBiped.HC_Body_Bone" 0.00 0.00 0.00 rotate -0.00 0.00 -50.00
$attachment "head" "ValveBiped.HC_Body_Bone" 0.00 0.00 0.00 rotate -0.00 0.00 -50.00
$attachment "chest" "ValveBiped.Bip01_Spine4" -3.00 6.00 0.00 rotate 0.00 60.00 90.00
$attachment "maw" "ValveBiped.Bip01_Spine2" -0.00 8.00 0.00 rotate 0.00 90.00 90.00
$attachment "Blood_Left" "ValveBiped.Bip01_L_Finger2" -0.00 -0.00 0.00 rotate -0.00 -0.00 0.00
$attachment "Blood_Right" "ValveBiped.Bip01_R_Finger2" -0.00 -0.00 0.00 rotate 0.00 -0.00 0.00
$surfaceprop "zombieflesh"
$eyeposition 0.000 0.000 64.000
$illumposition 6.562 -2.972 31.757
$sequence Idle01 "Idle01" loop ACT_IDLE 1 fps 30.00 
$animation a_WalkS "a_WalkS" loop fps 24.000000 LX LY 
$animation a_WalkSE "a_WalkSE" loop fps 24.000000 LX LY 
$animation a_WalkE "a_WalkE" loop fps 24.000000 LX LY 
$animation a_WalkNE "a_WalkNE" loop fps 24.000000 LX LY 
$animation a_walk1 "a_walk1" loop fps 24.000000 LX LY 
$animation a_WalkNW "a_WalkNW" loop fps 24.000000 LX LY 
$animation a_WalkW "a_WalkW" loop fps 24.000000 LX LY 
$animation a_WalkSW "a_WalkSW" loop fps 24.000000 LX LY 
$sequence walk "a_WalkS" loop ACT_WALK 1 fps 24.00 {
{ event AE_ZOMBIE_STEP_LEFT 5 }
{ event AE_ZOMBIE_STEP_RIGHT 15 }
{ event AE_ZOMBIE_SCUFF_LEFT 20 }
{ event AE_ZOMBIE_STEP_LEFT 28 }
{ event AE_ZOMBIE_STEP_RIGHT 38 }
{ event AE_ZOMBIE_SCUFF_LEFT 40 }
blendwidth 9
blend move_yaw -180.000000 180.000000
a_WalkSE a_WalkE a_WalkNE a_walk1 a_WalkNW a_WalkW a_WalkSW a_WalkS
}
$animation a_walk2 "a_walk2" loop fps 24.000000 
$sequence walk2 "a_WalkS" loop ACT_WALK 1 fps 24.00 {
{ event AE_ZOMBIE_STEP_LEFT 7 }
{ event AE_ZOMBIE_SCUFF_RIGHT 10 }
{ event AE_ZOMBIE_STEP_RIGHT 21 }
{ event AE_ZOMBIE_STEP_LEFT 31 }
{ event AE_ZOMBIE_SCUFF_RIGHT 34 }
{ event AE_ZOMBIE_STEP_RIGHT 44 }
blendwidth 9
blend move_yaw -180.000000 180.000000
a_WalkSE a_WalkE a_WalkNE a_walk2 a_WalkNW a_WalkW a_WalkSW a_WalkS
}
$animation a_walk3 "a_walk3" loop fps 24.000000 LX LY 
$sequence walk3 "a_WalkS" loop ACT_WALK 1 fps 24.00 {
{ event AE_ZOMBIE_STEP_LEFT 7 }
{ event AE_ZOMBIE_STEP_RIGHT 18 }
{ event AE_ZOMBIE_SCUFF_LEFT 21 }
{ event AE_ZOMBIE_STEP_LEFT 32 }
{ event AE_ZOMBIE_STEP_RIGHT 40 }
{ event AE_ZOMBIE_SCUFF_LEFT 44 }
blendwidth 9
blend move_yaw -180.000000 180.000000
a_WalkSE a_WalkE a_WalkNE a_walk3 a_WalkNW a_WalkW a_WalkSW a_WalkS
}
$animation a_Walk4 "a_Walk4" loop fps 24.000000 LX LY 
$sequence walk4 "a_Walk4" loop ACT_WALK 1 fps 24.00 {
{ event AE_ZOMBIE_STEP_LEFT 4 }
{ event AE_ZOMBIE_STEP_RIGHT 16 }
{ event AE_ZOMBIE_STEP_LEFT 22 }
{ event AE_ZOMBIE_STEP_RIGHT 28 }
{ event AE_ZOMBIE_STEP_LEFT 43 }
{ event AE_ZOMBIE_STEP_RIGHT 49 }
{ event AE_ZOMBIE_STEP_LEFT 58 }
{ event AE_ZOMBIE_STEP_RIGHT 67 }
}
$sequence FireWalk "FireWalk" loop ACT_WALK_ON_FIRE 1 fps 30.00 
$sequence FireIdle "FireIdle" loop ACT_IDLE_ON_FIRE 1 fps 30.00 
$sequence attackA "attackA" ACT_MELEE_ATTACK1 2 fps 30.00 {
{ event AE_ZOMBIE_ATTACK_SCREAM 5 }
{ event AE_ZOMBIE_ATTACK_RIGHT 25 }
}
$sequence attackB "attackB" ACT_MELEE_ATTACK1 2 fps 30.00 {
{ event AE_ZOMBIE_ATTACK_SCREAM 5 }
{ event AE_ZOMBIE_ATTACK_RIGHT 25 }
}
$sequence attackC "attackC" ACT_MELEE_ATTACK1 2 fps 30.00 {
{ event AE_ZOMBIE_ATTACK_SCREAM 5 }
{ event AE_ZOMBIE_ATTACK_LEFT 25 }
}
$sequence attackD "attackD" ACT_MELEE_ATTACK1 2 fps 30.00 {
{ event AE_ZOMBIE_ATTACK_SCREAM 5 }
{ event AE_ZOMBIE_ATTACK_LEFT 25 }
}
$sequence attackE "attackE" ACT_MELEE_ATTACK1 2 fps 30.00 {
{ event AE_ZOMBIE_ATTACK_SCREAM 5 }
{ event AE_ZOMBIE_ATTACK_BOTH 25 }
}
$sequence attackF "attackF" ACT_MELEE_ATTACK1 2 fps 30.00 {
{ event AE_ZOMBIE_ATTACK_SCREAM 5 }
{ event AE_ZOMBIE_ATTACK_BOTH 25 }
}
$sequence swatleftmid "swatleftmid" ACT_ZOM_SWATLEFTMID 1 fps 30.00 {
{ event AE_ZOMBIE_STARTSWAT 1 }
{ event AE_ZOMBIE_SWATITEM 9 }
}
$sequence swatrightmid "swatrightmid" ACT_ZOM_SWATRIGHTMID 1 fps 30.00 {
{ event AE_ZOMBIE_STARTSWAT 1 }
{ event AE_ZOMBIE_SWATITEM 9 }
}
$sequence swatleftlow "swatleftlow" ACT_ZOM_SWATLEFTLOW 1 fps 30.00 {
{ event AE_ZOMBIE_STARTSWAT 1 }
{ event AE_ZOMBIE_SWATITEM 15 }
}
$sequence swatrightlow "swatrightlow" ACT_ZOM_SWATRIGHTLOW 1 fps 30.00 {
{ event AE_ZOMBIE_STARTSWAT 1 }
{ event AE_ZOMBIE_SWATITEM 18 }
}
$sequence releasecrab "releasecrab" ACT_ZOM_RELEASECRAB 1 fps 30.00
$sequence physflinch1 "physflinch1" ACT_FLINCH_PHYSICS 1 fps 30.00
$sequence physflinch2 "physflinch2" ACT_FLINCH_PHYSICS 1 fps 30.00
$sequence physflinch3 "physflinch3" ACT_FLINCH_PHYSICS 1 fps 30.00
$sequence smashfall64 "smashfall64" fps 30.00 {
{ event AE_NPC_BODYDROP_HEAVY 10 }
{ event AE_NPC_BODYDROP_HEAVY 27 }
{ event AE_NPC_BODYDROP_HEAVY 37 }
{ event AE_ZOMBIE_GET_UP 75 }
}
$sequence slump_a "slump_a" loop fps 30.00
$sequence slumprise_a "slumprise_a" fps 30.00 {
{ event AE_NPC_LEFTFOOT 15 }
{ event AE_NPC_RIGHTFOOT 50 }
{ event AE_ZOMBIE_GET_UP 80 }
}
$sequence slumprise_a_attack "slumprise_a_attack" fps 30.00 {
{ event AE_NPC_LEFTFOOT 15 }
{ event AE_NPC_RIGHTFOOT 50 }
{ event AE_ZOMBIE_GET_UP 80 }
{ event AE_ZOMBIE_ATTACK_SCREAM 16 }
{ event AE_ZOMBIE_ATTACK_RIGHT 36 }
}
$sequence slumprise_a2 "slumprise_a2" fps 30.00 {
{ event AE_NPC_RIGHTFOOT 16 }
{ event AE_NPC_RIGHTFOOT 22 }
{ event AE_ZOMBIE_GET_UP 24 }
}
$sequence slump_b "slump_b" loop fps 30.00
$sequence slumprise_b "slumprise_b" fps 30.00 {
{ event AE_NPC_LEFTFOOT 13 }
{ event AE_NPC_RIGHTFOOT 27 }
{ event AE_ZOMBIE_GET_UP 57 }
}
$sequence Breakthrough "Breakthrough" fps 30.00
$sequence canal5await "canal5await" fps 30.00
$sequence canal5aattack "canal5aattack" fps 30.00
$animation mdldecompiler_delta.smd "mdldecompiler_delta.smd" fps 30
$sequence flinch1inDelta "flinch1inDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch1inFrame "flinch1inFrame" fps 30.00
$sequence flinch1CoreDelta "flinch1CoreDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch1OutFrame "flinch1OutFrame" fps 30.00
$sequence flinch1outDelta "flinch1outDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch1 "flinch1" ACT_GESTURE_FLINCH_HEAD 1 fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch2inDelta "flinch2inDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch2inFrame "flinch2inFrame" fps 30.00
$sequence flinch2CoreDelta "flinch2CoreDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch2OutFrame "flinch2OutFrame" fps 30.00
$sequence flinch2outDelta "flinch2outDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch2 "flinch2" ACT_GESTURE_FLINCH_HEAD 1 fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch3inDelta "flinch3inDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch3inFrame "flinch3inFrame" fps 30.00
$sequence flinch3CoreDelta "flinch3CoreDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch3OutFrame "flinch3OutFrame" fps 30.00
$sequence flinch3outDelta "flinch3outDelta" fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence flinch3 "flinch3" ACT_GESTURE_FLINCH_HEAD 1 fps 30.00 subtract mdldecompiler_delta.smd 0
$sequence Tantrum "Tantrum" loop ACT_ZOMBIE_TANTRUM 1 fps 30.00
$sequence WallPound "WallPound" loop ACT_ZOMBIE_WALLPOUND 1 fps 30.00 {
{ event AE_ZOMBIE_POUND 14 }
{ event AE_ZOMBIE_POUND 35 }
}
$sequence ragdoll "ragdoll" ACT_DIERAGDOLL 1 fps 30.00
$ikchain rhand ValveBiped.Bip01_R_Hand knee 0.640 0.769 0.000
$ikchain lhand ValveBiped.Bip01_L_Hand knee 0.607 0.795 0.000
$ikchain rfoot ValveBiped.Bip01_R_Foot knee 0.545 -0.838 0.000
$ikchain lfoot ValveBiped.Bip01_L_Foot knee 0.518 -0.855 -0.000
$collisionjoints "phymodel.smd" {
$mass 100.0
$inertia 10.00
$damping 0.10
$rotdamping 3.00
$rootbone "valvebiped.bip01_pelvis"
$jointmerge "ValveBiped.Bip01_Pelvis" "ValveBiped.Bip01_Spine1"
$jointconstrain "valvebiped.bip01_spine2" x limit -44.00 44.00 0.20
$jointconstrain "valvebiped.bip01_spine2" y limit -39.00 39.00 0.20
$jointconstrain "valvebiped.bip01_spine2" z limit -32.00 50.00 0.20
$jointconstrain "valvebiped.bip01_r_clavicle" x limit -30.00 30.00 0.20
$jointconstrain "valvebiped.bip01_r_clavicle" y limit -46.00 46.00 0.20
$jointconstrain "valvebiped.bip01_r_clavicle" z limit -26.00 48.00 0.20
$jointconstrain "valvebiped.bip01_r_upperarm" x limit -39.00 39.00 0.20
$jointconstrain "valvebiped.bip01_r_upperarm" y limit -79.00 95.00 0.20
$jointconstrain "valvebiped.bip01_r_upperarm" z limit -93.00 28.00 0.20
$jointconstrain "valvebiped.bip01_l_clavicle" x limit -30.00 30.00 0.20
$jointconstrain "valvebiped.bip01_l_clavicle" y limit -46.00 46.00 0.20
$jointconstrain "valvebiped.bip01_l_clavicle" z limit -26.00 48.00 0.20
$jointconstrain "valvebiped.bip01_l_upperarm" x limit -30.00 30.00 0.20
$jointconstrain "valvebiped.bip01_l_upperarm" y limit -95.00 84.00 0.20
$jointconstrain "valvebiped.bip01_l_upperarm" z limit -86.00 26.00 0.20
$jointconstrain "valvebiped.bip01_l_forearm" x limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_l_forearm" y limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_l_forearm" z limit -149.00 4.00 0.20
$jointconstrain "valvebiped.bip01_l_hand" x limit -55.00 55.00 0.20
$jointconstrain "valvebiped.bip01_l_hand" y limit -55.00 55.00 0.20
$jointconstrain "valvebiped.bip01_l_hand" z limit -55.00 55.00 0.20
$jointconstrain "valvebiped.bip01_r_forearm" x limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_r_forearm" y limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_r_forearm" z limit -149.00 4.00 0.20
$jointconstrain "valvebiped.bip01_r_thigh" x limit -12.00 12.00 0.20
$jointconstrain "valvebiped.bip01_r_thigh" y limit -8.00 75.00 0.20
$jointconstrain "valvebiped.bip01_r_thigh" z limit -97.00 32.00 0.20
$jointconstrain "valvebiped.bip01_r_calf" x limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_r_calf" y limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_r_calf" z limit -12.00 126.00 0.20
$jointconstrain "valvebiped.bip01_r_foot" x limit 0.00 0.00 0.00
$jointconstrain "valvebiped.bip01_r_foot" y limit -25.00 6.00 0.20
$jointconstrain "valvebiped.bip01_r_foot" z limit -15.00 35.00 0.20
$jointconstrain "valvebiped.bip01_l_thigh" x limit -12.00 12.00 0.20
$jointconstrain "valvebiped.bip01_l_thigh" y limit -73.00 6.00 0.20
$jointconstrain "valvebiped.bip01_l_thigh" z limit -93.00 30.00 0.20
$jointconstrain "valvebiped.bip01_l_calf" x limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_l_calf" y limit 0.00 0.00 0.20
$jointconstrain "valvebiped.bip01_l_calf" z limit -8.00 126.00 0.20
$jointconstrain "valvebiped.bip01_l_foot" x limit 0.00 0.00 0.00
$jointconstrain "valvebiped.bip01_l_foot" y limit -19.00 19.00 0.20
$jointconstrain "valvebiped.bip01_l_foot" z limit -15.00 35.00 0.20
$jointconstrain "valvebiped.bip01_r_hand" x limit -55.00 55.00 0.20
$jointconstrain "valvebiped.bip01_r_hand" y limit -55.00 55.00 0.20
$jointconstrain "valvebiped.bip01_r_hand" z limit -55.00 55.00 0.20
}
Recompiling the model and textures
- Launch Studio Compiler
- Select Material Compile
- Check all the boxes as seen in the picture.
- Under MaterialsclickAddand select the .targa images we made in Photoshop earlier.
- Under TGA for normal mapselect the normal map texture indecompile.
- Under compiled material directorytypezombie_classic.
- Click the Compilebutton, once completed move to the next step.
- Select Model Compile, then selectCompile with existing qc.
- Select the blue directory icon next to the qc file space.
- Navigate to your decompiledirectory and select the .qc file you just edited.
- Press the compileicon.
- Studio Compiler then begins to process your .smd files.
- Your models have now been recompiled to their appropriate directories.
- Once you are finished, close studio compiler.
Testing your model
Congratulations! You've just completed your first NPC with locked animations. The easiest way to view your models is to make a shortcut to model viewer on your desktop and drag the files onto it.
- Navigate to your Source SDK binary directory at ...\Steam\SteamApps\yourname\sourcesdk\bin.
- Select the program named hlmvand right click on it.
- Select Send toand clickDesktop (create shortcut). A shortcut is now on your desktop.
- Navigate to your modelsdirectory in your mod's directory.
- Open the Zombiedirectory.
- Select the model Classicand drag it onto thehlmvshortcut. The model viewer opens.
- Under the Rendertab, select theGroundcheckbox.
- Select the Sequencetab and select thewalkanimation.
- The ground underneath the model should now move, which means that the model will change position in game.
For further assistance, feel free to contact original author Frederick Ellis at fe029@operamail.com.










