General SDK Snippets & Fixes

From Valve Developer Community
Revision as of 06:39, 24 December 2009 by Z33ky (talk | contribs)
Jump to navigation Jump to search


Replace zombie's blood with human's blood

Human blood for zombie.

in hl2_dll\npc_zombie.cpp, go to line 279.

#ifdef HL2_EPISODIC
       SetBloodColor ( BLOOD_COLOR_ZOMBIE );

modify it to look like this:

#ifdef HL2_EPISODIC
       SetBloodColor ( BLOOD_COLOR_RED );


Remove Head Crab

How to Remove HeadCrab from zombie

in hl2_dll\npc_zombie.cpp look for void CZombie::Spawn( void ) then find this line.

m_fIsHeadless = false;

and simply change it to read this

m_fIsHeadless = true;

Now open hl2_dll\npc_BaseZombie.cpp and change this section to look like this.

//-----------------------------------------------------------------------------
// Purpose: A zombie has taken damage. Determine whether he release his headcrab.
// Output : YES, IMMEDIATE, or SCHEDULED (see HeadcrabRelease_t)
//-----------------------------------------------------------------------------
HeadcrabRelease_t CNPC_BaseZombie::ShouldReleaseHeadcrab( const CTakeDamageInfo &info, float flDamageThreshold )
{
	return ( m_iHealth <= 0 && m_fIsTorso && IsChopped( info ) )?RELEASE_RAGDOLL_SLICED_OFF:RELEASE_NO;
}

Working CS:S Muzzle Flashes without Model Editing

In c_baseanimating.cpp, at line 3024 (after the big switch statement), comment out the code so it looks like this

			if ( iAttachment != -1 && m_Attachments.Count() > iAttachment )
			{
				/*
				GetAttachment( iAttachment+1, attachOrigin, attachAngles );
				int entId = render->GetViewEntity();
				ClientEntityHandle_t hEntity = ClientEntityList().EntIndexToHandle( entId );
				tempents->MuzzleFlash( attachOrigin, attachAngles, atoi( options ), hEntity, bFirstPerson );
				*/
			}

and insert the following code after the comment.

 				if ( input->CAM_IsThirdPerson() )
 				{
 					C_BaseCombatWeapon *pWeapon = GetActiveWeapon();
 					pWeapon->GetAttachment( iAttachment+1, attachOrigin, attachAngles );
 				}
 				else
 				{
 					C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
 					CBaseViewModel *vm = pPlayer->GetViewModel();
 					vm->GetAttachment( iAttachment+1, attachOrigin, attachAngles );
 					engine->GetViewAngles( attachAngles );
 				}
 				g_pEffects->MuzzleFlash( attachOrigin, attachAngles, 1.0, MUZZLEFLASH_TYPE_DEFAULT );

Go to fx.cpp, under the statement pParticle->m_vecVelocity.Init(); in FX_MuzzleFlash, place the following code.

		C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
		Vector velocity = pPlayer->GetLocalVelocity();
		pParticle->m_vecVelocity += velocity;

Crossbow Bolt going through glass (func_breakable)

Open weapon_crossbow.cpp

In CCrossbowBolt::BoltTouch( CBaseEntity *pOther ) After :

if ( pOther->GetCollisionGroup() == COLLISION_GROUP_BREAKABLE_GLASS )
	return;

Insert the following code :

if(FClassnameIs(pOther, "func_breakable"))
{
    CBreakable* pOtherEntity =  static_cast<CBreakable*> (pOther);
    if(pOtherEntity->GetMaterialType() == matGlass)
        return;
}

Ignite Your Ragdolls

In your player's class (CSDKPlayer or CBasePlayer) find the Event_Killed() function. Add this inside of it:

if( info.GetDamageType() & (DMG_BLAST|DMG_BURN) )
{
    if( m_hRagdoll )
    {
        CBaseAnimating *pRagdoll = (CBaseAnimating *)CBaseEntity::Instance(m_hRagdoll);
        if( info.GetDamageType() & (DMG_BURN|DMG_BLAST) )
        {
            pRagdoll->Ignite(45, false, 10 );
        }
    }
}

If you don't have a ragdoll to ignite before that is called, make sure that code is placed after a call to CreateRagdollEntity(). If you're not doing that, add it in right above the if( info.GetDamageType() & (DMG_BLAST|DMG_BURN) ) line.

Control height and width of icon progress bars

This allows you to control the height and width of progress bars drawn with icons instead of the bars being the same dimensions as the textures.
In the file hud.h add the function declaration:

void	DrawIconProgressBarExt( int x, int y, int w, int h, CHudTexture *icon, CHudTexture *icon2, float percentage, Color &clr, int type );

Underneath the old declaration:

void    DrawIconProgressBar( int x, int y, CHudTexture *icon, CHudTexture *icon2, float percentage, Color& clr, int type );

Then in hud_redraw.cpp add the function itself:

void CHud::DrawIconProgressBarExt( int x, int y, int w, int h, CHudTexture *icon, CHudTexture *icon2, float percentage, Color& clr, int type )
{
	if ( icon == NULL )
		return;

	//Clamp our percentage
	percentage = min( 1.0f, percentage );
	percentage = max( 0.0f, percentage );

	int	height = icon->Height();
	int	width  = icon->Width();

	//Draw a vertical progress bar
	if ( type == HUDPB_VERTICAL )
	{
		int	barOfs = height * percentage;

		icon2->DrawSelfCropped( 
			x, y,  // Pos
			0, 0, width, barOfs, // Cropped subrect
			w, (h * percentage), clr );

		icon->DrawSelfCropped( 
			x, y + (h * percentage), 
			0, barOfs, width, height - barOfs, // Cropped subrect
			w, h - (h * percentage), clr );
	}
}

This was tested with vertical bars, horizontal bars haven't been tested.

Enabling func_precipitation rendering whilst in a point_viewcontrol

In viewrender.cpp find and delete:

if ( CurrentViewID() == VIEW_MONITOR )
   return;

Randomizing Models

Have some global constant char* of every model:

static const char* modelnames[] = {
"Model1", //0
"Model2", //1
"Model3", //2
};

And choose one at random in Spawn:

SetModel (modelnames[ random->RandomInt( 0, _ARRAYSIZE(modelnames) ) ]);

And if you wish to have a differant skin for each model (provided your model was compiled with multiple skins), then you can add:

m_nSkin = random->RandomInt( 0, GetModelPtr()->numskinfamilies() );

Stopping viewmodels from getting rotated when zooming

in CViewRender::SetUpView (view.cpp) search the line

m_View.fovViewmodel = g_pClientMode->GetViewModelFOV() - flFOVOffset;

and replace it with

m_View.fovViewmodel = abs(g_pClientMode->GetViewModelFOV() - flFOVOffset);

That will simply stop negative FOVs to occur, which were causing a rotating of 180°.