From 624b16bd8f33291b4a5ab254ee3d5b43c98b45da Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Thu, 1 Aug 2019 03:27:01 +0300 Subject: [PATCH] Update shock trooper and shock roach --- dlls/gearbox/shock.cpp | 117 ++++++++++++++++++++++-------------- dlls/gearbox/shockroach.cpp | 24 +++++--- dlls/gearbox/shockroach.h | 1 + dlls/gearbox/strooper.cpp | 111 +++++++++++++++++++--------------- dlls/headcrab.cpp | 16 ++--- dlls/headcrab.h | 2 +- dlls/hgrunt.cpp | 5 ++ dlls/hgrunt.h | 1 + 8 files changed, 164 insertions(+), 113 deletions(-) diff --git a/dlls/gearbox/shock.cpp b/dlls/gearbox/shock.cpp index 40c34f20..1fc22329 100644 --- a/dlls/gearbox/shock.cpp +++ b/dlls/gearbox/shock.cpp @@ -51,6 +51,8 @@ public: void CreateEffects(); void ClearEffects(); + void UpdateOnRemove(); + CBeam *m_pBeam; CBeam *m_pNoise; CSprite *m_pSprite; @@ -100,9 +102,7 @@ void CShock::FlyThink() if (pev->waterlevel == 3) { entvars_t *pevOwner = VARS(pev->owner); - const int iVolume = RANDOM_FLOAT(0.8f, 1); - const int iPitch = RANDOM_FLOAT(80, 110); - EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/shock_impact.wav", iVolume, ATTN_NORM, 0, iPitch); + EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/shock_impact.wav", VOL_NORM, ATTN_NORM); RadiusDamage(pev->origin, pev, pevOwner ? pevOwner : pev, pev->dmg * 3, 144, CLASS_NONE, DMG_SHOCK | DMG_ALWAYSGIB ); ClearEffects(); SetThink( &CBaseEntity::SUB_Remove ); @@ -117,9 +117,9 @@ void CShock::FlyThink() void CShock::Shoot(entvars_t *pevOwner, const Vector angles, const Vector vecStart, const Vector vecVelocity) { CShock *pShock = GetClassPtr((CShock *)NULL); + UTIL_SetOrigin(pShock->pev, vecStart); pShock->Spawn(); - UTIL_SetOrigin(pShock->pev, vecStart); pShock->pev->velocity = vecVelocity; pShock->pev->owner = ENT(pevOwner); pShock->pev->angles = angles; @@ -134,17 +134,7 @@ void CShock::Touch(CBaseEntity *pOther) return; TraceResult tr = UTIL_GetGlobalTrace( ); - int iPitch, iVolume; - // Lower the volume if touched entity is not a player. - iVolume = (!pOther->IsPlayer()) - ? RANDOM_FLOAT(0.4f, 0.5f) - : RANDOM_FLOAT(0.8f, 1); - - iPitch = RANDOM_FLOAT(80, 110); - - // splat sound - EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/shock_impact.wav", iVolume, ATTN_NORM, 0, iPitch); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); WRITE_BYTE(TE_DLIGHT); WRITE_COORD(pev->origin.x); // X @@ -158,11 +148,22 @@ void CShock::Touch(CBaseEntity *pOther) WRITE_BYTE( 10 ); // decay * 0.1 MESSAGE_END( ); + CBaseMonster* pMonster = pOther->MyMonsterPointer(); + if (pMonster && pMonster->IsAlive()) + { + pMonster->GlowShellOn( Vector( 0, 220, 255 ), .5f ); + } + ClearEffects(); if (!pOther->pev->takedamage) { // make a splat on the wall - UTIL_DecalTrace(&tr, DECAL_SMALLSCORCH1 + RANDOM_LONG(0, 2)); +#if FEATURE_OPFOR_DECALS + const int baseDecal = DECAL_OPFOR_SCORCH1; +#else + const int baseDecal = DECAL_SMALLSCORCH1; +#endif + UTIL_DecalTrace(&tr, baseDecal + RANDOM_LONG(0, 2)); int iContents = UTIL_PointContents(pev->origin); @@ -174,21 +175,16 @@ void CShock::Touch(CBaseEntity *pOther) } else { + int damageType = DMG_SHOCK; + if (pMonster && !pMonster->IsAlive()) + { + damageType |= DMG_CLUB; + } ClearMultiDamage(); entvars_t *pevOwner = VARS(pev->owner); - int damageType = DMG_ENERGYBEAM; - if (pOther->pev->deadflag == DEAD_DEAD) - { - damageType |= DMG_ALWAYSGIB; - } - else - { - CBaseMonster* pMonster = pOther->MyMonsterPointer(); - if (pMonster) - pMonster->GlowShellOn( Vector( 0, 220, 255 ), .5f ); - } - pOther->TraceAttack(pev, pev->dmg, pev->velocity.Normalize(), &tr, damageType ); - ApplyMultiDamage(pev, pevOwner ? pevOwner : pev); + entvars_t *pevAttacker = pevOwner ? pevOwner : pev; + pOther->TraceAttack(pevAttacker, pev->dmg, pev->velocity.Normalize(), &tr, damageType ); + ApplyMultiDamage(pev, pevAttacker); if (pOther->IsPlayer() && (UTIL_PointContents(pev->origin) != CONTENTS_WATER)) { const Vector position = tr.vecEndPos; @@ -200,18 +196,24 @@ void CShock::Touch(CBaseEntity *pOther) MESSAGE_END(); } } + + // splat sound + EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/shock_impact.wav", VOL_NORM, ATTN_NORM); + + pev->modelindex = 0; + pev->solid = SOLID_NOT; SetThink( &CBaseEntity::SUB_Remove ); - pev->nextthink = gpGlobals->time; + pev->nextthink = gpGlobals->time + 0.01; // let the sound play } void CShock::CreateEffects() { m_pSprite = CSprite::SpriteCreate( "sprites/flare3.spr", pev->origin, FALSE ); m_pSprite->SetAttachment( edict(), 0 ); - m_pSprite->pev->scale = 0.4; + m_pSprite->pev->scale = 0.35; m_pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 170, kRenderFxNoDissipation ); - m_pSprite->pev->spawnflags |= SF_SPRITE_TEMPORARY; - m_pSprite->pev->flags |= FL_SKIPLOCALHOST; + //m_pSprite->pev->spawnflags |= SF_SPRITE_TEMPORARY; + //m_pSprite->pev->flags |= FL_SKIPLOCALHOST; m_pBeam = CBeam::BeamCreate( "sprites/lgtning.spr", 30 ); @@ -220,14 +222,18 @@ void CShock::CreateEffects() m_pBeam->EntsInit( entindex(), entindex() ); m_pBeam->SetStartAttachment( 1 ); m_pBeam->SetEndAttachment( 2 ); - m_pBeam->SetBrightness( 190 ); - m_pBeam->SetScrollRate( 20 ); - m_pBeam->SetNoise( 20 ); + m_pBeam->SetBrightness( 180 ); + m_pBeam->SetScrollRate( 10 ); + m_pBeam->SetNoise( 0 ); m_pBeam->SetFlags( BEAM_FSHADEOUT ); m_pBeam->SetColor( 0, 255, 255 ); - m_pBeam->pev->spawnflags = SF_BEAM_TEMPORARY; + //m_pBeam->pev->spawnflags = SF_BEAM_TEMPORARY; m_pBeam->RelinkBeam(); } + else + { + ALERT(at_console, "Could no create shockbeam beam!\n"); + } m_pNoise = CBeam::BeamCreate( "sprites/lgtning.spr", 30 ); @@ -236,24 +242,43 @@ void CShock::CreateEffects() m_pNoise->EntsInit( entindex(), entindex() ); m_pNoise->SetStartAttachment( 1 ); m_pNoise->SetEndAttachment( 2 ); - m_pNoise->SetBrightness( 190 ); - m_pNoise->SetScrollRate( 20 ); - m_pNoise->SetNoise( 65 ); + m_pNoise->SetBrightness( 180 ); + m_pNoise->SetScrollRate( 30 ); + m_pNoise->SetNoise( 30 ); m_pNoise->SetFlags( BEAM_FSHADEOUT ); m_pNoise->SetColor( 255, 255, 173 ); - m_pNoise->pev->spawnflags = SF_BEAM_TEMPORARY; + //m_pNoise->pev->spawnflags = SF_BEAM_TEMPORARY; m_pNoise->RelinkBeam(); } + else + { + ALERT(at_console, "Could no create shockbeam noise!\n"); + } } void CShock::ClearEffects() { - UTIL_Remove( m_pBeam ); - m_pBeam = NULL; + if (m_pBeam) + { + UTIL_Remove( m_pBeam ); + m_pBeam = NULL; + } - UTIL_Remove( m_pNoise ); - m_pNoise = NULL; + if (m_pNoise) + { + UTIL_Remove( m_pNoise ); + m_pNoise = NULL; + } - UTIL_Remove( m_pSprite ); - m_pSprite = NULL; + if (m_pSprite) + { + UTIL_Remove( m_pSprite ); + m_pSprite = NULL; + } +} + +void CShock::UpdateOnRemove() +{ + CBaseAnimating::UpdateOnRemove(); + ClearEffects(); } diff --git a/dlls/gearbox/shockroach.cpp b/dlls/gearbox/shockroach.cpp index 060aa3f7..9b258960 100644 --- a/dlls/gearbox/shockroach.cpp +++ b/dlls/gearbox/shockroach.cpp @@ -129,13 +129,11 @@ void CShockRoach::LeapTouch(CBaseEntity *pOther) // Don't hit if back on ground if (!FBitSet(pev->flags, FL_ONGROUND)) { - EMIT_SOUND_DYN(edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY(pBiteSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch()); - + EMIT_SOUND_DYN(edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY(pBiteSounds), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch()); // Give the shockrifle weapon to the player, if not already in possession. - CBasePlayer* pPlayer = dynamic_cast(pOther); - if (pPlayer && !(pPlayer->pev->weapons & (1 << WEAPON_SHOCKRIFLE))) - { + if (pOther->IsPlayer() && pOther->IsAlive() && !(pOther->pev->weapons & (1 << WEAPON_SHOCKRIFLE))) { + CBasePlayer* pPlayer = (CBasePlayer*)(pOther); pPlayer->GiveNamedItem("weapon_shockrifle"); pPlayer->pev->weapons |= (1 << WEAPON_SHOCKRIFLE); UTIL_Remove(this); @@ -173,7 +171,7 @@ void CShockRoach::PrescheduleThink(void) //========================================================= void CShockRoach::IdleSound(void) { - EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pIdleSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch()); + EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pIdleSounds), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch()); } //========================================================= @@ -181,7 +179,7 @@ void CShockRoach::IdleSound(void) //========================================================= void CShockRoach::AlertSound(void) { - EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pAlertSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch()); + EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pAlertSounds), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch()); } //========================================================= @@ -189,7 +187,7 @@ void CShockRoach::AlertSound(void) //========================================================= void CShockRoach::PainSound(void) { - EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pPainSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch()); + EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pPainSounds), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch()); } //========================================================= @@ -197,7 +195,7 @@ void CShockRoach::PainSound(void) //========================================================= void CShockRoach::DeathSound(void) { - EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pDeathSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch()); + EMIT_SOUND_DYN(edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY(pDeathSounds), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch()); } @@ -209,7 +207,7 @@ void CShockRoach::StartTask(Task_t *pTask) { case TASK_RANGE_ATTACK1: { - EMIT_SOUND_DYN(edict(), CHAN_WEAPON, pAttackSounds[0], GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch()); + EMIT_SOUND_DYN(edict(), CHAN_WEAPON, pAttackSounds[0], GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch()); m_IdealActivity = ACT_RANGE_ATTACK1; SetTouch(&CShockRoach::LeapTouch); break; @@ -218,3 +216,9 @@ void CShockRoach::StartTask(Task_t *pTask) CHeadCrab::StartTask(pTask); } } + +int CShockRoach::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) +{ + // Skip headcrab's TakeDamage to avoid unwanted immunity to acid. + return CBaseMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType ); +} diff --git a/dlls/gearbox/shockroach.h b/dlls/gearbox/shockroach.h index 1ecd5ea9..9a7251f7 100644 --- a/dlls/gearbox/shockroach.h +++ b/dlls/gearbox/shockroach.h @@ -31,6 +31,7 @@ public: void AlertSound(void); void PrescheduleThink(void); void StartTask(Task_t* pTask); + int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); virtual int Save(CSave &save); virtual int Restore(CRestore &restore); diff --git a/dlls/gearbox/strooper.cpp b/dlls/gearbox/strooper.cpp index c4d9ecb3..4da8e53d 100644 --- a/dlls/gearbox/strooper.cpp +++ b/dlls/gearbox/strooper.cpp @@ -115,7 +115,14 @@ public: void MonsterThink(); void Precache(void); int Classify(void); + BOOL CheckRangeAttack1(float flDot, float flDist); + BOOL CheckRangeAttack2(float flDot, float flDist); void HandleAnimEvent(MonsterEvent_t *pEvent); + void SetObjectCollisionBox( void ) + { + pev->absmin = pev->origin + Vector( -24, -24, 0 ); + pev->absmax = pev->origin + Vector( 24, 24, 72 ); + } void SetActivity(Activity NewActivity); @@ -124,6 +131,11 @@ public: void IdleSound(void); void GibMonster(void); + void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType); + virtual int SizeForGrapple() { return GRAPPLE_LARGE; } + + void DropShockRoach(); + int Save(CSave &save); int Restore(CRestore &restore); @@ -142,7 +154,7 @@ public: static const char *pGruntSentences[]; }; -LINK_ENTITY_TO_CLASS(monster_shocktrooper, CStrooper); +LINK_ENTITY_TO_CLASS(monster_shocktrooper, CStrooper) TYPEDESCRIPTION CStrooper::m_SaveData[] = { @@ -152,7 +164,7 @@ TYPEDESCRIPTION CStrooper::m_SaveData[] = DEFINE_FIELD(CStrooper, m_eyeChangeTime, FIELD_TIME), }; -IMPLEMENT_SAVERESTORE(CStrooper, CHGrunt); +IMPLEMENT_SAVERESTORE(CStrooper, CHGrunt) const char *CStrooper::pGruntSentences[] = { @@ -198,25 +210,9 @@ void CStrooper::SpeakSentence( void ) //========================================================= void CStrooper::GibMonster(void) { - Vector vecGunPos; - Vector vecGunAngles; - - if (GetBodygroup(1) != 1) - {// throw a shockroach if the shock trooper has one - GetAttachment(0, vecGunPos, vecGunAngles); - - CBaseEntity* pRoach = DropItem("monster_shockroach", vecGunPos, vecGunAngles); - - if (pRoach) - { - pRoach->pev->owner = edict(); - - if (m_hEnemy) - pRoach->pev->angles = (pev->origin - m_hEnemy->pev->origin).Normalize(); - - // Remove any pitch. - pRoach->pev->angles.x = 0; - } + if (GetBodygroup(GUN_GROUP) != GUN_NONE) + { + DropShockRoach(); } EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "common/bodysplat.wav", 1, ATTN_NORM ); @@ -277,6 +273,19 @@ int CStrooper::Classify(void) return CLASS_ALIEN_MILITARY; } +BOOL CStrooper::CheckRangeAttack1(float flDot, float flDist) +{ + return m_cAmmoLoaded >= 1 && CHGrunt::CheckRangeAttack1(flDot, flDist); +} + +BOOL CStrooper::CheckRangeAttack2( float flDot, float flDist ) +{ + if( !FBitSet( pev->weapons, STROOPER_HANDGRENADE ) ) + { + return FALSE; + } + return CheckRangeAttack2Impl(gSkillData.strooperGrenadeSpeed, flDot, flDist); +} //========================================================= // HandleAnimEvent - catches the monster-specific messages @@ -288,34 +297,9 @@ void CStrooper::HandleAnimEvent(MonsterEvent_t *pEvent) { case STROOPER_AE_DROP_GUN: { - Vector vecGunPos; - Vector vecGunAngles; - - GetAttachment(0, vecGunPos, vecGunAngles); - - // switch to body group with no gun. - SetBodygroup(GUN_GROUP, GUN_NONE); - - Vector vecDropAngles = vecGunAngles; - - - if (m_hEnemy) - vecDropAngles = (m_hEnemy->pev->origin - pev->origin).Normalize(); - - // Remove any pitch. - vecDropAngles.x = 0; - - // now spawn a shockroach. - CBaseEntity* pRoach = DropItem("monster_shockroach", vecGunPos, vecDropAngles); - if (pRoach) + if (GetBodygroup(GUN_GROUP) != GUN_NONE) { - pRoach->pev->owner = edict(); - - if (m_hEnemy) - pRoach->pev->angles = (pev->origin - m_hEnemy->pev->origin).Normalize(); - - // Remove any pitch. - pRoach->pev->angles.x = 0; + DropShockRoach(); } } break; @@ -516,6 +500,8 @@ void CStrooper::Precache() PRECACHE_SOUND("zombie/claw_miss2.wav");// because we use the basemonster SWIPE animation event + UTIL_PrecacheOther("shock_beam"); + UTIL_PrecacheOther("spore"); UTIL_PrecacheOther("monster_shockroach"); // get voice pitch @@ -592,6 +578,35 @@ void CStrooper::DeathSound(void) } } +//========================================================= +// TraceAttack - reimplemented in shock trooper because they never have helmets +//========================================================= +void CStrooper::TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) +{ + CSquadMonster::TraceAttack(pevAttacker, flDamage, vecDir, ptr, bitsDamageType); +} + +void CStrooper::DropShockRoach() +{ + Vector vecGunPos; + Vector vecGunAngles; + + GetAttachment(0, vecGunPos, vecGunAngles); + SetBodygroup(GUN_GROUP, GUN_NONE); + + Vector vecDropAngles = vecGunAngles; + + // Remove any pitch. + vecDropAngles.x = 0; + vecDropAngles.z = 0; + + Vector vecPos = pev->origin; + vecPos.z += 32; + + // now spawn a shockroach. + CBaseEntity::Create( "monster_shockroach", vecPos, vecDropAngles ); +} + //========================================================= // SetActivity diff --git a/dlls/headcrab.cpp b/dlls/headcrab.cpp index c8efb833..00bd8d1d 100644 --- a/dlls/headcrab.cpp +++ b/dlls/headcrab.cpp @@ -226,7 +226,7 @@ void CHeadCrab::HandleAnimEvent( MonsterEvent_t *pEvent ) int iSound = RANDOM_LONG(0,2); if( iSound != 0 ) - EMIT_SOUND_DYN( edict(), CHAN_VOICE, pAttackSounds[iSound], GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); + EMIT_SOUND_DYN( edict(), CHAN_VOICE, pAttackSounds[iSound], GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch() ); pev->velocity = vecJumpDir; m_flNextAttack = gpGlobals->time + 2; @@ -320,7 +320,7 @@ void CHeadCrab::LeapTouch( CBaseEntity *pOther ) // Don't hit if back on ground if( !FBitSet( pev->flags, FL_ONGROUND ) ) { - EMIT_SOUND_DYN( edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY( pBiteSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); + EMIT_SOUND_DYN( edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY( pBiteSounds ), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch() ); pOther->TakeDamage( pev, pev, GetDamageAmount(), DMG_SLASH ); } @@ -348,7 +348,7 @@ void CHeadCrab::StartTask( Task_t *pTask ) { case TASK_RANGE_ATTACK1: { - EMIT_SOUND_DYN( edict(), CHAN_WEAPON, pAttackSounds[0], GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); + EMIT_SOUND_DYN( edict(), CHAN_WEAPON, pAttackSounds[0], GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch() ); m_IdealActivity = ACT_RANGE_ATTACK1; SetTouch( &CHeadCrab::LeapTouch ); break; @@ -404,7 +404,7 @@ int CHeadCrab::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, floa //========================================================= void CHeadCrab::IdleSound( void ) { - EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pIdleSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); + EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pIdleSounds ), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch() ); } //========================================================= @@ -412,7 +412,7 @@ void CHeadCrab::IdleSound( void ) //========================================================= void CHeadCrab::AlertSound( void ) { - EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pAlertSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); + EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pAlertSounds ), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch() ); } //========================================================= @@ -420,7 +420,7 @@ void CHeadCrab::AlertSound( void ) //========================================================= void CHeadCrab::PainSound( void ) { - EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pPainSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); + EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pPainSounds ), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch() ); } //========================================================= @@ -428,7 +428,7 @@ void CHeadCrab::PainSound( void ) //========================================================= void CHeadCrab::DeathSound( void ) { - EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pDeathSounds ), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); + EMIT_SOUND_DYN( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pDeathSounds ), GetSoundVolume(), ATTN_IDLE, 0, GetVoicePitch() ); } Schedule_t *CHeadCrab::GetScheduleOfType( int Type ) @@ -455,7 +455,7 @@ public: BOOL CheckRangeAttack1( float flDot, float flDist ); Schedule_t *GetScheduleOfType ( int Type ); virtual int GetVoicePitch( void ) { return PITCH_NORM + RANDOM_LONG( 40, 50 ); } - virtual float GetSoundVolue( void ) { return 0.8; } + virtual float GetSoundVolume( void ) { return 0.8; } }; LINK_ENTITY_TO_CLASS( monster_babycrab, CBabyCrab ) diff --git a/dlls/headcrab.h b/dlls/headcrab.h index 5d4c3733..5b35ebc1 100644 --- a/dlls/headcrab.h +++ b/dlls/headcrab.h @@ -43,7 +43,7 @@ public: virtual float GetDamageAmount(void) { return gSkillData.headcrabDmgBite; } virtual int GetVoicePitch(void) { return 100; } - virtual float GetSoundVolue(void) { return 1.0; } + virtual float GetSoundVolume(void) { return 1.0; } Schedule_t* GetScheduleOfType(int Type); CUSTOM_SCHEDULES diff --git a/dlls/hgrunt.cpp b/dlls/hgrunt.cpp index 5d11ca8a..f819c379 100644 --- a/dlls/hgrunt.cpp +++ b/dlls/hgrunt.cpp @@ -407,6 +407,11 @@ BOOL CHGrunt::CheckRangeAttack1( float flDot, float flDist ) // attack. //========================================================= BOOL CHGrunt::CheckRangeAttack2( float flDot, float flDist ) +{ + return CheckRangeAttack2Impl(gSkillData.hgruntGrenadeSpeed, flDot, flDist); +} + +BOOL CHGrunt::CheckRangeAttack2Impl( float grenadeSpeed, float flDot, float flDist ) { if( !FBitSet( pev->weapons, ( HGRUNT_HANDGRENADE | HGRUNT_GRENADELAUNCHER ) ) ) { diff --git a/dlls/hgrunt.h b/dlls/hgrunt.h index 785b0e49..9f8bb15a 100644 --- a/dlls/hgrunt.h +++ b/dlls/hgrunt.h @@ -32,6 +32,7 @@ public: BOOL CheckMeleeAttack1(float flDot, float flDist); BOOL CheckRangeAttack1(float flDot, float flDist); BOOL CheckRangeAttack2(float flDot, float flDist); + BOOL CheckRangeAttack2Impl( float grenadeSpeed, float flDot, float flDist ); void CheckAmmo(void); void SetActivity(Activity NewActivity); void StartTask(Task_t *pTask);