Category:Tutorials: Difference between revisions
No edit summary |
Microbeast (talk | contribs) (Npc Animation Locking) |
||
Line 1: | Line 1: | ||
== Quick guide to locking NPC animations for a custom model. by: Frederick Ellis == | |||
This is my first tutorial, so bear with me. After hours of of fooling around with .qc files and searching for a solution | |||
to this problem, I finally figured out how to fix it. It's simplier than you think. We will use the Zombie Classic model | |||
for this tutorial. We will only cover the decompiling process and locking the animations, then recompiling. | |||
''''Tools required:'''' | |||
-hl/ hl source | |||
-Cannonfodders studio compiler (do not use Cannonfodders stand-alone mdl decompile, it has a bug in it when decompiling this file. | |||
-3d studioMax/ Cannon fodders 3dstudioMax .smd export/import plug-ins | |||
-GCFScape | |||
-Adobe Photoshop and VTF Import plugin | |||
Lets begin: | |||
'''1. Create a decompile folder to store your .smd's files, mdl. files and texture files.''' | |||
-On the desktop, create a folder called 'decompile' | |||
-In your mod directory, open your 'models' folder (if there isn't one, then create one) create a folder named 'Zombie' exactly like that. | |||
-In your mod directory, open the folder 'materials', then create a folder named 'models'. Under that folder create another folder named zombie_classic. So it should look like materials/models/zombie_classic. p.s ignore the period | |||
Note: if you screw up your directories and don't label them verbatim i.e. not using caps when needed, then your going to run into a world of problems. | |||
'''2. Extract the zombie model and its textures.''' | |||
-Open GCFScape | |||
Note: GCFScape will sometimes not open with steam running in the background, if this happens, just close steam. | |||
-Extract the zombie classic model with GCFscape found in: C:\Program Files\Steam\SteamApps\source models and place it in the decompile folder | |||
-Next extract the zombie textures with GCFScape found in: C:\Program Files\Steam\SteamApps\source materials and place them in the decompile folder as well. | |||
Note: for the Zombie texture location, look in GCFScape under hl2/materials/Models/Zombie_Classic | |||
'''3. Open the .VTF files with Photoshop and convert them to .targa''' | |||
-We need to change the zombie textures you just extracted into targa's temporily for viewing later on. Launch Photoshop and goto 'file', 'open' scroll to your 'decompile' folder and select Zombie_Classic_Sheet.vtf. Then goto 'file' 'save as' and save the document as a .targa file an place it in the 'decompile' folder. Do the same for the normal map texture. | |||
Note: be sure NOT to load the .VMT file, instead of the .VTF file. | |||
'''4. Decompile the model.''' | |||
-Open StudioCompiler and select 'Model Decompile' | |||
[[Image:decompile.jpg]] | |||
Next to the 'choose model file' line, select the blue folder icon and open the Classic.mdl file that you extracted from GCFScape located in your 'decompile' folder. | |||
Note: you might have to type in the location of the model under 'choose model file' | |||
-Under 'choose output directory' select the blue folder icon and browse to the 'decompile' folder you created on the desktop. | |||
-Click the 'extract' button to decompile your model and extract it into the 'decompile' folder you created on the desktop | |||
[[Image:smd.jpg]] | |||
You will notice in the folder you created (make sure you set studio compilers 'mdl decompile' to extract the files in the folder you just made) a bunch of files with the extension .smd and a text file with the extension .qc . I will get back to the .qc file later, for now, we just need the .smd files. | |||
[[Image:import.jpg]] | |||
'''5. Launch 3D StudioMax.''' | |||
-In 3D StudioMax goto 'File' then 'import' select .smd for the file type. Goto the 'decompile' folder you created and select the file named 'Zombie_reference.smd', click 'Open'. Note: make sure you have installed Cannon Fodders 3D Studio Max .smd import/export plugins into the 3dsmax plugin directory. | |||
-A window will pop up asking what you want to import. Check all boxes 'import triangles', 'import skeleton', 'prompt for missing textures', 'rebuild smoothing groups' then click 'O.K.' | |||
-After pressing 'O.K'. another window will pop up asking for the textures that you extracted earlier. Under file type, select .targa. Scroll to the 'decompile' folder and select the .targa file that you saved earlier. Load the file. Note: be sure not to load the normal map image file! Your model should look like this. | |||
[[Image:max_view.jpg]] | |||
Bingo, there's your zombie model in the viewport. | |||
'''6. Load animation files.''' | |||
Were half-way there. | |||
Now, for the part you all have been waiting for, how in the world do I lock this things animations!?! | |||
-Goto 'file', 'import' and scroll to the 'decompile' file and select the .smd file named 'a_walk1.smd' | |||
-This time when Cannon Fodders window pops up, uncheck all boxes except 'import skeleton' which you will leave checked. 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 'smd import' -delete it. | |||
'''7. Move the 'Root' bone.''' | |||
-Press F3 on your keyboard to view wireframe. | |||
-Zoom into the middle of the models pelvis area and select the bone labeled 'ValveBiped.Bip01_Pelvis' | |||
-To insure 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 not, you have selected the wrong bone. | |||
[[Image:root.jpg]] | |||
-Next we will 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 key' button at the bottom of the screen | |||
[[Image:auto.jpg]] | |||
-Move the time slider to the last key in the slider. | |||
-Using the move tool, move the model by the 'Root' Bone foward a few feet on the screen. | |||
[[Image:root_move.jpg]] | |||
-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. | |||
-Goto 'file', 'export', for file type select .smd. Scroll to the 'decompile' folder and overwrite the existing file named "a_walk1" with the one you just saved. | |||
-Now import the remaining walk files labled "a_walk1, a_walk2, a_walkNE, a_walkSW, ect." and do the same to these files. Make sure you overwrite all the walk animations with your new ones. Note: when working with animation files labled with a SW or NW ect. at the end of them i.e. "a_walkSW" , make sure to move the root bone into that direction. Example: move a walk animation labeld A_walkNE into a north east direction, as shown below. | |||
Start: | |||
[[Image:nw_move1.jpg]] | |||
End: | |||
[[Image:nw_move2.jpg]] | |||
'''8. Editing the .qc file.''' | |||
-After overwriting all the walk animations with new ones, close 3d StudioMax. | |||
-Goto the decompile folder and open the .qc file with notepad as shown below. | |||
[[Image:qc1111.jpg]] | |||
-The next step is the most important. We will now officially "lock" the animations. | |||
-After every animation line you are going to add the text LX LY, exactly like that, with the spaces. | |||
[[Image:qc2111.jpg]] | |||
-Your code should look like this: | |||
$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 | |||
} | |||
-To prevent any bugs, I suggest copying this code, and pasting it into your .qc file. | |||
-Close the .qc file. | |||
'''9. Recompiling the model and textures.''' | |||
-Launch studio compiler | |||
-Select 'Material Compile' | |||
[[Image:compile_texts.jpg]] | |||
-Check all the boxes as seen above. | |||
-Under 'Materials' click 'add' and select the .targa images we made in photoshop earlier. | |||
-Under 'TGA for normal map' select the normal map texture in 'decompile' as well. | |||
-Under 'compiled material directory' type zombie_classic | |||
-MAKE SURE YOUR SCREEN LOOKS LIKE THE ONE ABOVE! | |||
-Click the 'Compile' button, once completed move to the next step. | |||
Next: | |||
-In Studio Compiler select Model Compile, then select compile with existing qc. | |||
[[Image:compile.jpg]] | |||
-Select the blue folder icon next to the qc file space. | |||
-Scroll back to your 'decompile' folder and select the .qc file you just edited. | |||
-Press the 'compile' icon. | |||
-Studio Compiler then begins to process your .smd files. | |||
-Your models have now been recompiled to there appropiate directories. | |||
-Once completed, close studio compiler. | |||
''' | |||
10. Testing your model.''' | |||
Congratulations! You've just completed your first NPC with locked animations. Now, for the moment of truth, cross your fingers and pucker your butt cheeks cause here we go! | |||
The easiest way to view your models is to make a shortcut to model viewer on your desktop and drag the files onto it. | |||
-Goto your sourcesdk bin folder: C:\Program Files\Steam\SteamApps\yourname\sourcesdk\bin | |||
-Select the program named 'hlmv' and right click it. | |||
-Select 'send to' the select 'desktop(create shortcut)' a shortcut is now on the desktop | |||
-Goto your models directory in YOUR mod. | |||
-Open the 'Zombie' folder | |||
-Select the model 'Classic' and drag it onto the hlmv (half-life model viewer) shortcut you just created | |||
-Model viewer opens. Under the render tab, select the 'Ground' Checkbox' | |||
-Select the 'Sequence tab' and select the 'walk' animation. | |||
[[Image:viewer.jpg]] | |||
-The ground underneath the model should now move. Which means that the model will move postion in HL. | |||
And there you have it, locking animations for custom NPC'S. I hope this tutorial will help someone out there, so they won't have to spend the hours I did figuring this thing out. Please note: when in game you animations might move awkwardly. This tutorial wasn't meant to make them move perfect, it was made just to make them move, period. It will take some custom tweaking when moving the root bone to make it look right. | |||
Any questions feel free to contact me at '''fe029@operamail.com. | |||
''' | |||
Tutorial by: Frederick Ellis | |||
Special thanks to Cannon Fodder for creating these awesome programs that ''we all'' use for our mods. | |||
Cheers! | |||
--[[User:Microbeast|Microbeast]] 20:38, 20 Apr 2006 (PDT) |
Revision as of 20:38, 20 April 2006
Quick guide to locking NPC animations for a custom model. by: Frederick Ellis
This is my first tutorial, so bear with me. After hours of of fooling around with .qc files and searching for a solution
to this problem, I finally figured out how to fix it. It's simplier than you think. We will use the Zombie Classic model
for this tutorial. We will only cover the decompiling process and locking the animations, then recompiling.
'Tools required:'
-hl/ hl source
-Cannonfodders studio compiler (do not use Cannonfodders stand-alone mdl decompile, it has a bug in it when decompiling this file.
-3d studioMax/ Cannon fodders 3dstudioMax .smd export/import plug-ins
-GCFScape
-Adobe Photoshop and VTF Import plugin
Lets begin:
1. Create a decompile folder to store your .smd's files, mdl. files and texture files.
-On the desktop, create a folder called 'decompile'
-In your mod directory, open your 'models' folder (if there isn't one, then create one) create a folder named 'Zombie' exactly like that.
-In your mod directory, open the folder 'materials', then create a folder named 'models'. Under that folder create another folder named zombie_classic. So it should look like materials/models/zombie_classic. p.s ignore the period
Note: if you screw up your directories and don't label them verbatim i.e. not using caps when needed, then your going to run into a world of problems.
2. Extract the zombie model and its textures.
-Open GCFScape
Note: GCFScape will sometimes not open with steam running in the background, if this happens, just close steam.
-Extract the zombie classic model with GCFscape found in: C:\Program Files\Steam\SteamApps\source models and place it in the decompile folder
-Next extract the zombie textures with GCFScape found in: C:\Program Files\Steam\SteamApps\source materials and place them in the decompile folder as well.
Note: for the Zombie texture location, look in GCFScape under hl2/materials/Models/Zombie_Classic
3. Open the .VTF files with Photoshop and convert them to .targa
-We need to change the zombie textures you just extracted into targa's temporily for viewing later on. Launch Photoshop and goto 'file', 'open' scroll to your 'decompile' folder and select Zombie_Classic_Sheet.vtf. Then goto 'file' 'save as' and save the document as a .targa file an place it in the 'decompile' folder. Do the same for the normal map texture.
Note: be sure NOT to load the .VMT file, instead of the .VTF file.
4. Decompile the model.
-Open StudioCompiler and select 'Model Decompile'
Next to the 'choose model file' line, select the blue folder icon and open the Classic.mdl file that you extracted from GCFScape located in your 'decompile' folder.
Note: you might have to type in the location of the model under 'choose model file'
-Under 'choose output directory' select the blue folder icon and browse to the 'decompile' folder you created on the desktop.
-Click the 'extract' button to decompile your model and extract it into the 'decompile' folder you created on the desktop
You will notice in the folder you created (make sure you set studio compilers 'mdl decompile' to extract the files in the folder you just made) a bunch of files with the extension .smd and a text file with the extension .qc . I will get back to the .qc file later, for now, we just need the .smd files.
5. Launch 3D StudioMax.
-In 3D StudioMax goto 'File' then 'import' select .smd for the file type. Goto the 'decompile' folder you created and select the file named 'Zombie_reference.smd', click 'Open'. Note: make sure you have installed Cannon Fodders 3D Studio Max .smd import/export plugins into the 3dsmax plugin directory.
-A window will pop up asking what you want to import. Check all boxes 'import triangles', 'import skeleton', 'prompt for missing textures', 'rebuild smoothing groups' then click 'O.K.'
-After pressing 'O.K'. another window will pop up asking for the textures that you extracted earlier. Under file type, select .targa. Scroll to the 'decompile' folder and select the .targa file that you saved earlier. Load the file. Note: be sure not to load the normal map image file! Your model should look like this.
Bingo, there's your zombie model in the viewport.
6. Load animation files.
Were half-way there.
Now, for the part you all have been waiting for, how in the world do I lock this things animations!?!
-Goto 'file', 'import' and scroll to the 'decompile' file and select the .smd file named 'a_walk1.smd'
-This time when Cannon Fodders window pops up, uncheck all boxes except 'import skeleton' which you will leave checked. 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 'smd import' -delete it.
7. Move the 'Root' bone.
-Press F3 on your keyboard to view wireframe.
-Zoom into the middle of the models pelvis area and select the bone labeled 'ValveBiped.Bip01_Pelvis'
-To insure 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 not, you have selected the wrong bone.
-Next we will 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 key' button at the bottom of the screen
-Move the time slider to the last key in the slider.
-Using the move tool, move the model by the 'Root' Bone foward a few feet on the screen.
-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.
-Goto 'file', 'export', for file type select .smd. Scroll to the 'decompile' folder and overwrite the existing file named "a_walk1" with the one you just saved.
-Now import the remaining walk files labled "a_walk1, a_walk2, a_walkNE, a_walkSW, ect." and do the same to these files. Make sure you overwrite all the walk animations with your new ones. Note: when working with animation files labled with a SW or NW ect. at the end of them i.e. "a_walkSW" , make sure to move the root bone into that direction. Example: move a walk animation labeld A_walkNE into a north east direction, as shown below.
End:
8. Editing the .qc file.
-After overwriting all the walk animations with new ones, close 3d StudioMax.
-Goto the decompile folder and open the .qc file with notepad as shown below.
-The next step is the most important. We will now officially "lock" the animations.
-After every animation line you are going to add the text LX LY, exactly like that, with the spaces.
-Your code should look like this:
$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 }
-To prevent any bugs, I suggest copying this code, and pasting it into your .qc file.
-Close the .qc file.
9. Recompiling the model and textures.
-Launch studio compiler
-Select 'Material Compile'
-Check all the boxes as seen above.
-Under 'Materials' click 'add' and select the .targa images we made in photoshop earlier.
-Under 'TGA for normal map' select the normal map texture in 'decompile' as well.
-Under 'compiled material directory' type zombie_classic
-MAKE SURE YOUR SCREEN LOOKS LIKE THE ONE ABOVE!
-Click the 'Compile' button, once completed move to the next step.
Next:
-In Studio Compiler select Model Compile, then select compile with existing qc.
-Select the blue folder icon next to the qc file space.
-Scroll back to your 'decompile' folder and select the .qc file you just edited.
-Press the 'compile' icon.
-Studio Compiler then begins to process your .smd files.
-Your models have now been recompiled to there appropiate directories.
-Once completed, close studio compiler. 10. Testing your model.
Congratulations! You've just completed your first NPC with locked animations. Now, for the moment of truth, cross your fingers and pucker your butt cheeks cause here we go!
The easiest way to view your models is to make a shortcut to model viewer on your desktop and drag the files onto it.
-Goto your sourcesdk bin folder: C:\Program Files\Steam\SteamApps\yourname\sourcesdk\bin
-Select the program named 'hlmv' and right click it.
-Select 'send to' the select 'desktop(create shortcut)' a shortcut is now on the desktop
-Goto your models directory in YOUR mod.
-Open the 'Zombie' folder
-Select the model 'Classic' and drag it onto the hlmv (half-life model viewer) shortcut you just created
-Model viewer opens. Under the render tab, select the 'Ground' Checkbox'
-Select the 'Sequence tab' and select the 'walk' animation.
-The ground underneath the model should now move. Which means that the model will move postion in HL.
And there you have it, locking animations for custom NPC'S. I hope this tutorial will help someone out there, so they won't have to spend the hours I did figuring this thing out. Please note: when in game you animations might move awkwardly. This tutorial wasn't meant to make them move perfect, it was made just to make them move, period. It will take some custom tweaking when moving the root bone to make it look right.
Any questions feel free to contact me at fe029@operamail.com. Tutorial by: Frederick Ellis
Special thanks to Cannon Fodder for creating these awesome programs that we all use for our mods.
Cheers! --Microbeast 20:38, 20 Apr 2006 (PDT)
Subcategories
This category has the following 7 subcategories, out of 7 total.
C
- Choreography creation (9 P)
D
M
P
- Portal 2 Tutorials (61 P)
- Portal level design (empty)
S
- SDKNuts Tutorials (100 P)
W
- Weapons programming (42 P)
Pages in category "Tutorials"
The following 200 pages are in this category, out of 438 total.
(previous page) (next page)A
- Accessing Other Entities
- Adapting PBR Textures to Source
- Add Mod Content to Hammer
- Adding a Camera Bone to a Viewmodel
- Adding a Dynamic Scope
- Adding a dynamic sky to your mod
- Adding a new weapon to your mod
- Adding a Scope
- Adding a Weapon Drop System
- Adding an experience system
- Adding an inventory
- Adding chapters to your mod
- Adding class based health differences
- Adding Convars to the Multiplayer Advanced Tab
- Adding Headlights to the Buggy
- Adding Light
- Adding Mesh To Existing Viewmodels
- Adding Muzzle Flashes that lights up the world
- Adding MySQL++
- Adding New Ammotypes
- Adding PBR to Your Mod
- Adding Point Entities
- Adding Portal-style regenerating health
- Adding Prop Models
- Adding Proximity Voice
- Adding the Game Instructor
- Adding Water
- Adding Weapon Inspect
- Talk:Source Mod Installers
- Alien Swarm Level Creation/Your first Alien Swarm map
- Alien Teleport Effect (HL1)
- Alternative Multi-Stop Elevator
- Ammo pack (TFC)
- Animated cursor
- Animating Weapons
- Animation in XSI
- Antlions: Random Spawn
- Applying Textures
- Applying Textures/v2draft
- Areaportal tutorial
- Arrival departure transition ents.vmf (Portal 2)
- Authoring a Brush Entity
- Authoring a Brush Entity/Code
- Authoring a Logical Entity
- Authoring a Model Entity
- Authoring and Using TrueType Fonts
- AVI Materials
B
- Basic Construction
- Basic Hud Modification
- Battlefield Style Hitmarker
- Blowout Doors
- Bonus Maps
- Box dropper
- Breakable Glass
- BSP Content Extraction
- BTS Light Sources
- BTS Sewer Room
- BTS Support Beams
- BTS Turret Repair Rooms
- Bullet Penetration in Counter-Strike: Source
- Bullet Penetration in Day of Defeat: Source
- Bump map
- Burst Fire (Machine Gun)
C
- Camera Bob
- Car Explosions
- Changing default spawn weapons
- Changing max ammo in HL2
- Changing Maximum Player Count
- Changing prop models dynamically
- Changing the fading speed of the GUI Windows
- Changing the viewmodel bob
- Choreography creation
- Clock
- CollisionProperty
- Color Theory in Level Design
- Command line
- Compiling a model
- Compiling under VS2002
- Compiling under VS2003
- Compiling under VS2005
- Compiling under VS2005/Older SDK
- Compiling under VS2008
- Compiling under VS2010
- Compiling under VS2012
- Compiling under VS2022
- Compiling vgui controls.lib
- Compiling your map using htct
- Complex Brush Creation
- Complimentary Victory Lift
- Configuring Hammer for Day of Defeat
- Configuring Hammer for Deathmatch Classic
- Configuring Hammer for Half-Life
- Configuring Hammer for Half-Life Deathmatch: Source
- Configuring Hammer for Half-Life: Source
- Controlling portals
- Converting brushes to models with XSI
- Counter-Strike: Global Offensive/Game Modes/Co-op Strike
- Counter-Strike: Global Offensive/Game Modes/Danger Zone
- Counter-Strike: Global Offensive/Game Modes/Guardian
- Counter-Strike: Global Offensive/Game Modes/Retakes
- Counter-Strike: Global Offensive/Game Modes/Wingman
- Crate
- Create traffic lights
- Creating a Bomb Defusal Map
- Creating A Class System
- Creating a Classic Counter-Strike Map
- Creating a Curved Hallway
- Creating A Fire Particle
- Creating a Hostage Rescue Map
- Creating a Material
- Creating a moving platform
- Creating a Portal AI Voice
- Creating a portal elevator
- Creating a Portal Radio
- Creating a portal/object fizzler
- Creating a rotating portalgun
- Creating a Roundtimer
- Creating a security camera
- Creating a wake-up bed
- Creating a wall light
- Creating a Waterfall Material
- Creating a working Crane in Half-Life 2
- Creating a working mini-map for CS:GO
- Creating An Auto Portal
- Creating an energy ball launcher and catcher
- Creating an HL2DM megacharger
- Creating an incinerator
- Creating an Observation Hallway
- Creating Animated Clouds
- Creating BTS Fans
- Creating custom Portal 2 funnel music
- Creating Holes in Displacements
- Creating indicator lights
- Creating multiple buttons for one door
- Creating Player Spawns in Day of Defeat Source
- Creating poison water
- Creating Portal Breaking Ladders
- Creating Portal Cat Walks
- Creating Portal Doors
- Creating Portal Ducts
- Creating Portal Neurotoxin Gas
- Creating Portal Piston Panels
- Creating Portal Piston Types
- Creating Portal Speakers
- Creating Portal Turret Claws
- Creating Portal turrets
- Creating Portal Vacuum Tubes
- Creating Portal Vents
- Creating Spawns
- CSS/Animated Clouds
- Custom Floor Buttons
- Custom Menu Screen
- Custom Testchamber Signs
- Customizable triggered HUD-message
D
- Death notices with custom weapons
- Decals in GIMP
- Decals in Photoshop
- Decompiling Maps
- Demo Recording Tools
- Detailing BTS Areas
- Detailing BTS Wall Pipes
- Detailing metal walls
- Digital Elevation Models
- Displacement Grass
- DODS/Creating cap zones
- DODS/Creating the detonation map type
- DODS/Creating the main map area
- DODS/Creating Weapon Spawns
- Dog/Playing fetch
- Door creation
- Dropping empty magazines (GoldSrc)
- Dual Pistols (CSS Style)
- Dynamic assaults
- Dynamic RTT shadow angles in Source 2007
- Dynamic Viewmodel FOVs
- Dynamic Weapon Spawns
- Dynamic Weapon Spawns (Advanced)
E
F
- Fading Out NPC Ragdolls
- Fading The Player In Thirdperson
- Fading The Player In Thirdperson 2013
- Falling headcrab tutorial
- Filter Applications
- First Person Ragdolls In Singleplayer
- Fix Missing Player Animations
- Fixing DXT Green Tint Compression
- Fixing first time HL2DM compile problems
- Fixing trigger gravity