Welcome, Guest! Login | Register

Dynamic NPC Stepping Sound [Print this Article]
Posted by: ts2do
Date posted: Jan 30 2005
User Rating: N/A
Number of views: 2540
Number of comments: 0
Description: Replace default set of NPC stepping sounds with the set from the texture they're walking on.
First of all, open up monsters.cpp and add the following code before line 2623:
void CBaseMonster :: HandleAnimEvent( MonsterEvent_t *pEvent )
Much of the code below is just copied and revised from player movement code
some of it was from ricochet sound code
fvol is the volume of the step
 CODE (C++) 
extern "C" char PM_FindTextureType(char *name);
void NPC_Step(CBaseMonster *pMonster)
{
    char chTextureType;
    float fvol;
    char szbuffer[64];
    const char *pTextureName;
    TraceResult ptr;
    float fattn = ATTN_NORM;

    UTIL_TraceLine(pMonster->pev->origin + Vector(0, 0, 8), pMonster->pev->origin - Vector(0, 0, 16),dont_ignore_monsters,ENT(pMonster->pev),&ptr);
    CBaseEntity *pEntity = CBaseEntity::Instance(ptr.pHit);

    chTextureType = 0;
    if(pEntity)
        pTextureName = TRACE_TEXTURE( ENT(pEntity->pev), pMonster->pev->origin + Vector(0, 0, 8), pMonster->pev->origin - Vector(0, 0, 16) );
    else
        pTextureName = TRACE_TEXTURE( ENT(0), pMonster->pev->origin + Vector(0, 0, 8), pMonster->pev->origin - Vector(0, 0, 16) );
   
    if ( pTextureName )
    {
        // strip leading '-0' or '+0~' or '{' or '!'
        if (*pTextureName == '-' || *pTextureName == '+')
            pTextureName += 2;

        if (*pTextureName == '{' || *pTextureName == '!' || *pTextureName == '~' || *pTextureName == ' ')
            pTextureName++;
        // '}}'
        strcpy(szbuffer, pTextureName);
        szbuffer[CBTEXTURENAMEMAX - 1] = 0;

        // get texture type
        chTextureType = PM_FindTextureType((char *)pTextureName);
    }




    //---- custom code -----




Here's volume choice --- this includes customized NPC volumes:
 CODE (C++) 
if(FClassnameIs(pMonster,"monster_scientist"))fvol=0.5;
else if(FClassnameIs(pMonster,"monster_zombie"))
{
    switch(pMonster->m_Activity)
    {
        case ACT_WALK:
            fvol=0.8;
            break;
        case ACT_RUN:
            fvol=1.0;
            break;
        case ACT_DANCE://this would be any other animation that could call the npc step to play
            fvol=0.3;
            break;
    }
}
else fvol = (pMonster->m_Activity ==ACT_WALK)?0.3: 0.5;

the above line which is the walk detection that changes the volume is used so the players can differentiate between the two




Here's the sound choice:
 CODE (C++) 
char plSound[32];
if(FClassnameIs(pMonster,"monster_zombie"))
{
    switch(chTextureType)
    {
        case CHAR_TEX_METAL:
            plSound = "zombie/zo_metal1.wav";
            /*
               An example override sound
               of course if you wanted only SOME of them to be overriden, you must copy the cases from the switch below to it
               if you left it how it is now, itd only make step sounds for metal
               of course you could always put an if into the default switch way down there so it overrides ONLY chosen ones
            */

    }
}
else
{
    switch (chTextureType)
    {
    case CHAR_TEX_METAL:
        switch(RANDOM_LONG(0, 3))
        {
            case 0: plSound = "player/pl_metal1.wav";
            //all the way to pl_metal4
        }
        break;
    default://leave default so plSound will never be a blank string
    //concrete is taken care of anyway if left out >>>case CHAR_TEX_CONCRETE:
        switch(RANDOM_LONG(0, 3))
        {
            case 0: plSound = "player/pl_step1.wav";
            //all the way to pl_step4
        }
        break;
    }
}


Basically using the setup I made in the above switch, you can make a case for each below. You can use any wav u want AS LONG AS IT'S PRECACHED. These are listed with what would go in the case then the wav:
each wav take player/THISSPOT(1 to 4).wav in the name

CHAR_TEX_DIRT
pl_dirt

CHAR_TEX_VENT
pl_duct

CHAR_TEX_GRATE
pl_grate

CHAR_TEX_TILE
pl_tile

CHAR_TEX_SLOSH
pl_slosh

Use UTIL_EmitAmbientSound to emit the sound plSound from ENT(0) and with volume fvol so it wont take up the monster's channel and itll be the chosen volume

If you want to make a new script for your custom models, this is what you would do
 QUOTE  
Now, open up scriptevent.h and add the following before line 29: #endif
This can be ANY number other than script numbers that are already taken:
 CODE (C++) 
#define SCRIPT_EVENT_STEP 2000

Now go back to monsters.cpp and add the following case in the select in the HandleAnimEvent on line 2623
This is our custom step event, which you will need to add event 2000 into frames of your custom:
 CODE (C++) 
case SCRIPT_EVENT_STEP:
    NPC_Step(this);
    break;





If you want to change it so old models use the dynamic sounds:
 QUOTE  
Change the whole block from case SCRIPT_EVENT_SOUND: to break; to:

Check if the wav of the event is the step sound, if it is, override it with our new code, else just play it
 CODE (C++) 
case SCRIPT_EVENT_SOUND:            // Play a named wave file
    if(FStrEq(pEvent->options,"common/npc_step1.wav"))//||etc all the way to "npc_step4")
        NPC_Step(this);
    else EMIT_SOUND( edict(), CHAN_BODY, pEvent->options, 1.0, ATTN_IDLE );
        break;



Finally:
If you want to have hgrunts have their own step sound, you gotta add the event in to the model
AND
To make the steps even more 1337, you can go so far as making 2 events, one for left, and one for right (this'd depend on the model calling them correctly)

Rate This Article
This article has not yet been rated.

You have to register to rate this article.
User Comments

No User Comments

You must register to post a comment. If you have already registered, you must login.

Latest Articles
3rd person View in Multiplayer
Half-Life 2 | Coding | Client Side Tutorials
How to enable it in HL2DM

By: cct | Nov 13 2006

Making a Camera
Half-Life 2 | Level Design
This camera is good for when you join a map, it gives you a view of the map before you join a team

By: slackiller | Mar 04 2006

Making a camera , Part 2
Half-Life 2 | Level Design
these cameras are working monitors that turn on when a button is pushed.

By: slackiller | Mar 04 2006

Storing weapons on ladder
Half-Life 2 | Coding | Snippets
like Raven Sheild or BF2

By: British_Bomber | Dec 24 2005

Implementation of a string lookup table
Half-Life 2 | Coding | Snippets
A string lookup table is a set of functions that is used to convert strings to pre-defined values

By: deathz0rz | Nov 13 2005


Latest Comments
Where do we go from here
General | News
By: MIFUNE | Jun 09 2008
 
The Input/Output system
Half-Life 2 | Level Design
By: nazitaco | Dec 23 2007
 
Where do we go from here
General | News
By: Rob_F | Nov 22 2007
 
Rescaling Half-Life
Half-Life | Coding | Shared Tutorials
By: christoph | Nov 12 2007
 
GameUI
Half-Life 2 | Coding | Client Side Tutorials
By: Evil_j | Oct 29 2007
 
3 State Zoom For Any Weapon
Half-Life 2 | Coding | Server Side Tutorials
By: Ennuified | Oct 18 2007
 
Storing weapons on ladder
Half-Life 2 | Coding | Snippets
By: cct | Sep 07 2007
 
CTF Gameplay Part 1
Half-Life | Coding | Shared Tutorials
By: DarkNight | Aug 28 2007
 
CTF Gameplay Part 1
Half-Life | Coding | Shared Tutorials
By: deedok | Aug 20 2007
 
Debugging your half-life 2 mod
Half-Life 2 | Coding | Articles
By: blackshark | Aug 17 2007
 

Site Info
296 Approved Articless
5 Pending Articles
3940 Registered Members
0 People Online (14 guests)
About - Credits - Contact Us

Wavelength version: 3.0.0.9
Valid XHTML 1.0! Valid CSS!