mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-03-13 05:51:19 +00:00
Update shock trooper and shock roach
This commit is contained in:
parent
5d636b8519
commit
624b16bd8f
@ -51,6 +51,8 @@ public:
|
|||||||
void CreateEffects();
|
void CreateEffects();
|
||||||
void ClearEffects();
|
void ClearEffects();
|
||||||
|
|
||||||
|
void UpdateOnRemove();
|
||||||
|
|
||||||
CBeam *m_pBeam;
|
CBeam *m_pBeam;
|
||||||
CBeam *m_pNoise;
|
CBeam *m_pNoise;
|
||||||
CSprite *m_pSprite;
|
CSprite *m_pSprite;
|
||||||
@ -100,9 +102,7 @@ void CShock::FlyThink()
|
|||||||
if (pev->waterlevel == 3)
|
if (pev->waterlevel == 3)
|
||||||
{
|
{
|
||||||
entvars_t *pevOwner = VARS(pev->owner);
|
entvars_t *pevOwner = VARS(pev->owner);
|
||||||
const int iVolume = RANDOM_FLOAT(0.8f, 1);
|
EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/shock_impact.wav", VOL_NORM, ATTN_NORM);
|
||||||
const int iPitch = RANDOM_FLOAT(80, 110);
|
|
||||||
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/shock_impact.wav", iVolume, ATTN_NORM, 0, iPitch);
|
|
||||||
RadiusDamage(pev->origin, pev, pevOwner ? pevOwner : pev, pev->dmg * 3, 144, CLASS_NONE, DMG_SHOCK | DMG_ALWAYSGIB );
|
RadiusDamage(pev->origin, pev, pevOwner ? pevOwner : pev, pev->dmg * 3, 144, CLASS_NONE, DMG_SHOCK | DMG_ALWAYSGIB );
|
||||||
ClearEffects();
|
ClearEffects();
|
||||||
SetThink( &CBaseEntity::SUB_Remove );
|
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)
|
void CShock::Shoot(entvars_t *pevOwner, const Vector angles, const Vector vecStart, const Vector vecVelocity)
|
||||||
{
|
{
|
||||||
CShock *pShock = GetClassPtr((CShock *)NULL);
|
CShock *pShock = GetClassPtr((CShock *)NULL);
|
||||||
|
UTIL_SetOrigin(pShock->pev, vecStart);
|
||||||
pShock->Spawn();
|
pShock->Spawn();
|
||||||
|
|
||||||
UTIL_SetOrigin(pShock->pev, vecStart);
|
|
||||||
pShock->pev->velocity = vecVelocity;
|
pShock->pev->velocity = vecVelocity;
|
||||||
pShock->pev->owner = ENT(pevOwner);
|
pShock->pev->owner = ENT(pevOwner);
|
||||||
pShock->pev->angles = angles;
|
pShock->pev->angles = angles;
|
||||||
@ -134,17 +134,7 @@ void CShock::Touch(CBaseEntity *pOther)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
TraceResult tr = UTIL_GetGlobalTrace( );
|
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 );
|
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
|
||||||
WRITE_BYTE(TE_DLIGHT);
|
WRITE_BYTE(TE_DLIGHT);
|
||||||
WRITE_COORD(pev->origin.x); // X
|
WRITE_COORD(pev->origin.x); // X
|
||||||
@ -158,11 +148,22 @@ void CShock::Touch(CBaseEntity *pOther)
|
|||||||
WRITE_BYTE( 10 ); // decay * 0.1
|
WRITE_BYTE( 10 ); // decay * 0.1
|
||||||
MESSAGE_END( );
|
MESSAGE_END( );
|
||||||
|
|
||||||
|
CBaseMonster* pMonster = pOther->MyMonsterPointer();
|
||||||
|
if (pMonster && pMonster->IsAlive())
|
||||||
|
{
|
||||||
|
pMonster->GlowShellOn( Vector( 0, 220, 255 ), .5f );
|
||||||
|
}
|
||||||
|
|
||||||
ClearEffects();
|
ClearEffects();
|
||||||
if (!pOther->pev->takedamage)
|
if (!pOther->pev->takedamage)
|
||||||
{
|
{
|
||||||
// make a splat on the wall
|
// 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);
|
int iContents = UTIL_PointContents(pev->origin);
|
||||||
|
|
||||||
@ -174,21 +175,16 @@ void CShock::Touch(CBaseEntity *pOther)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int damageType = DMG_SHOCK;
|
||||||
|
if (pMonster && !pMonster->IsAlive())
|
||||||
|
{
|
||||||
|
damageType |= DMG_CLUB;
|
||||||
|
}
|
||||||
ClearMultiDamage();
|
ClearMultiDamage();
|
||||||
entvars_t *pevOwner = VARS(pev->owner);
|
entvars_t *pevOwner = VARS(pev->owner);
|
||||||
int damageType = DMG_ENERGYBEAM;
|
entvars_t *pevAttacker = pevOwner ? pevOwner : pev;
|
||||||
if (pOther->pev->deadflag == DEAD_DEAD)
|
pOther->TraceAttack(pevAttacker, pev->dmg, pev->velocity.Normalize(), &tr, damageType );
|
||||||
{
|
ApplyMultiDamage(pev, pevAttacker);
|
||||||
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);
|
|
||||||
if (pOther->IsPlayer() && (UTIL_PointContents(pev->origin) != CONTENTS_WATER))
|
if (pOther->IsPlayer() && (UTIL_PointContents(pev->origin) != CONTENTS_WATER))
|
||||||
{
|
{
|
||||||
const Vector position = tr.vecEndPos;
|
const Vector position = tr.vecEndPos;
|
||||||
@ -200,18 +196,24 @@ void CShock::Touch(CBaseEntity *pOther)
|
|||||||
MESSAGE_END();
|
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 );
|
SetThink( &CBaseEntity::SUB_Remove );
|
||||||
pev->nextthink = gpGlobals->time;
|
pev->nextthink = gpGlobals->time + 0.01; // let the sound play
|
||||||
}
|
}
|
||||||
|
|
||||||
void CShock::CreateEffects()
|
void CShock::CreateEffects()
|
||||||
{
|
{
|
||||||
m_pSprite = CSprite::SpriteCreate( "sprites/flare3.spr", pev->origin, FALSE );
|
m_pSprite = CSprite::SpriteCreate( "sprites/flare3.spr", pev->origin, FALSE );
|
||||||
m_pSprite->SetAttachment( edict(), 0 );
|
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->SetTransparency( kRenderTransAdd, 255, 255, 255, 170, kRenderFxNoDissipation );
|
||||||
m_pSprite->pev->spawnflags |= SF_SPRITE_TEMPORARY;
|
//m_pSprite->pev->spawnflags |= SF_SPRITE_TEMPORARY;
|
||||||
m_pSprite->pev->flags |= FL_SKIPLOCALHOST;
|
//m_pSprite->pev->flags |= FL_SKIPLOCALHOST;
|
||||||
|
|
||||||
m_pBeam = CBeam::BeamCreate( "sprites/lgtning.spr", 30 );
|
m_pBeam = CBeam::BeamCreate( "sprites/lgtning.spr", 30 );
|
||||||
|
|
||||||
@ -220,14 +222,18 @@ void CShock::CreateEffects()
|
|||||||
m_pBeam->EntsInit( entindex(), entindex() );
|
m_pBeam->EntsInit( entindex(), entindex() );
|
||||||
m_pBeam->SetStartAttachment( 1 );
|
m_pBeam->SetStartAttachment( 1 );
|
||||||
m_pBeam->SetEndAttachment( 2 );
|
m_pBeam->SetEndAttachment( 2 );
|
||||||
m_pBeam->SetBrightness( 190 );
|
m_pBeam->SetBrightness( 180 );
|
||||||
m_pBeam->SetScrollRate( 20 );
|
m_pBeam->SetScrollRate( 10 );
|
||||||
m_pBeam->SetNoise( 20 );
|
m_pBeam->SetNoise( 0 );
|
||||||
m_pBeam->SetFlags( BEAM_FSHADEOUT );
|
m_pBeam->SetFlags( BEAM_FSHADEOUT );
|
||||||
m_pBeam->SetColor( 0, 255, 255 );
|
m_pBeam->SetColor( 0, 255, 255 );
|
||||||
m_pBeam->pev->spawnflags = SF_BEAM_TEMPORARY;
|
//m_pBeam->pev->spawnflags = SF_BEAM_TEMPORARY;
|
||||||
m_pBeam->RelinkBeam();
|
m_pBeam->RelinkBeam();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ALERT(at_console, "Could no create shockbeam beam!\n");
|
||||||
|
}
|
||||||
|
|
||||||
m_pNoise = CBeam::BeamCreate( "sprites/lgtning.spr", 30 );
|
m_pNoise = CBeam::BeamCreate( "sprites/lgtning.spr", 30 );
|
||||||
|
|
||||||
@ -236,24 +242,43 @@ void CShock::CreateEffects()
|
|||||||
m_pNoise->EntsInit( entindex(), entindex() );
|
m_pNoise->EntsInit( entindex(), entindex() );
|
||||||
m_pNoise->SetStartAttachment( 1 );
|
m_pNoise->SetStartAttachment( 1 );
|
||||||
m_pNoise->SetEndAttachment( 2 );
|
m_pNoise->SetEndAttachment( 2 );
|
||||||
m_pNoise->SetBrightness( 190 );
|
m_pNoise->SetBrightness( 180 );
|
||||||
m_pNoise->SetScrollRate( 20 );
|
m_pNoise->SetScrollRate( 30 );
|
||||||
m_pNoise->SetNoise( 65 );
|
m_pNoise->SetNoise( 30 );
|
||||||
m_pNoise->SetFlags( BEAM_FSHADEOUT );
|
m_pNoise->SetFlags( BEAM_FSHADEOUT );
|
||||||
m_pNoise->SetColor( 255, 255, 173 );
|
m_pNoise->SetColor( 255, 255, 173 );
|
||||||
m_pNoise->pev->spawnflags = SF_BEAM_TEMPORARY;
|
//m_pNoise->pev->spawnflags = SF_BEAM_TEMPORARY;
|
||||||
m_pNoise->RelinkBeam();
|
m_pNoise->RelinkBeam();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ALERT(at_console, "Could no create shockbeam noise!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CShock::ClearEffects()
|
void CShock::ClearEffects()
|
||||||
{
|
{
|
||||||
UTIL_Remove( m_pBeam );
|
if (m_pBeam)
|
||||||
m_pBeam = NULL;
|
{
|
||||||
|
UTIL_Remove( m_pBeam );
|
||||||
|
m_pBeam = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
UTIL_Remove( m_pNoise );
|
if (m_pNoise)
|
||||||
m_pNoise = NULL;
|
{
|
||||||
|
UTIL_Remove( m_pNoise );
|
||||||
|
m_pNoise = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
UTIL_Remove( m_pSprite );
|
if (m_pSprite)
|
||||||
m_pSprite = NULL;
|
{
|
||||||
|
UTIL_Remove( m_pSprite );
|
||||||
|
m_pSprite = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CShock::UpdateOnRemove()
|
||||||
|
{
|
||||||
|
CBaseAnimating::UpdateOnRemove();
|
||||||
|
ClearEffects();
|
||||||
}
|
}
|
||||||
|
@ -129,13 +129,11 @@ void CShockRoach::LeapTouch(CBaseEntity *pOther)
|
|||||||
// Don't hit if back on ground
|
// Don't hit if back on ground
|
||||||
if (!FBitSet(pev->flags, FL_ONGROUND))
|
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.
|
// Give the shockrifle weapon to the player, if not already in possession.
|
||||||
CBasePlayer* pPlayer = dynamic_cast<CBasePlayer*>(pOther);
|
if (pOther->IsPlayer() && pOther->IsAlive() && !(pOther->pev->weapons & (1 << WEAPON_SHOCKRIFLE))) {
|
||||||
if (pPlayer && !(pPlayer->pev->weapons & (1 << WEAPON_SHOCKRIFLE)))
|
CBasePlayer* pPlayer = (CBasePlayer*)(pOther);
|
||||||
{
|
|
||||||
pPlayer->GiveNamedItem("weapon_shockrifle");
|
pPlayer->GiveNamedItem("weapon_shockrifle");
|
||||||
pPlayer->pev->weapons |= (1 << WEAPON_SHOCKRIFLE);
|
pPlayer->pev->weapons |= (1 << WEAPON_SHOCKRIFLE);
|
||||||
UTIL_Remove(this);
|
UTIL_Remove(this);
|
||||||
@ -173,7 +171,7 @@ void CShockRoach::PrescheduleThink(void)
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CShockRoach::IdleSound(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)
|
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)
|
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)
|
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:
|
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;
|
m_IdealActivity = ACT_RANGE_ATTACK1;
|
||||||
SetTouch(&CShockRoach::LeapTouch);
|
SetTouch(&CShockRoach::LeapTouch);
|
||||||
break;
|
break;
|
||||||
@ -218,3 +216,9 @@ void CShockRoach::StartTask(Task_t *pTask)
|
|||||||
CHeadCrab::StartTask(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 );
|
||||||
|
}
|
||||||
|
@ -31,6 +31,7 @@ public:
|
|||||||
void AlertSound(void);
|
void AlertSound(void);
|
||||||
void PrescheduleThink(void);
|
void PrescheduleThink(void);
|
||||||
void StartTask(Task_t* pTask);
|
void StartTask(Task_t* pTask);
|
||||||
|
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
|
||||||
|
|
||||||
virtual int Save(CSave &save);
|
virtual int Save(CSave &save);
|
||||||
virtual int Restore(CRestore &restore);
|
virtual int Restore(CRestore &restore);
|
||||||
|
@ -115,7 +115,14 @@ public:
|
|||||||
void MonsterThink();
|
void MonsterThink();
|
||||||
void Precache(void);
|
void Precache(void);
|
||||||
int Classify(void);
|
int Classify(void);
|
||||||
|
BOOL CheckRangeAttack1(float flDot, float flDist);
|
||||||
|
BOOL CheckRangeAttack2(float flDot, float flDist);
|
||||||
void HandleAnimEvent(MonsterEvent_t *pEvent);
|
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);
|
void SetActivity(Activity NewActivity);
|
||||||
|
|
||||||
@ -124,6 +131,11 @@ public:
|
|||||||
void IdleSound(void);
|
void IdleSound(void);
|
||||||
void GibMonster(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 Save(CSave &save);
|
||||||
int Restore(CRestore &restore);
|
int Restore(CRestore &restore);
|
||||||
|
|
||||||
@ -142,7 +154,7 @@ public:
|
|||||||
static const char *pGruntSentences[];
|
static const char *pGruntSentences[];
|
||||||
};
|
};
|
||||||
|
|
||||||
LINK_ENTITY_TO_CLASS(monster_shocktrooper, CStrooper);
|
LINK_ENTITY_TO_CLASS(monster_shocktrooper, CStrooper)
|
||||||
|
|
||||||
TYPEDESCRIPTION CStrooper::m_SaveData[] =
|
TYPEDESCRIPTION CStrooper::m_SaveData[] =
|
||||||
{
|
{
|
||||||
@ -152,7 +164,7 @@ TYPEDESCRIPTION CStrooper::m_SaveData[] =
|
|||||||
DEFINE_FIELD(CStrooper, m_eyeChangeTime, FIELD_TIME),
|
DEFINE_FIELD(CStrooper, m_eyeChangeTime, FIELD_TIME),
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_SAVERESTORE(CStrooper, CHGrunt);
|
IMPLEMENT_SAVERESTORE(CStrooper, CHGrunt)
|
||||||
|
|
||||||
const char *CStrooper::pGruntSentences[] =
|
const char *CStrooper::pGruntSentences[] =
|
||||||
{
|
{
|
||||||
@ -198,25 +210,9 @@ void CStrooper::SpeakSentence( void )
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CStrooper::GibMonster(void)
|
void CStrooper::GibMonster(void)
|
||||||
{
|
{
|
||||||
Vector vecGunPos;
|
if (GetBodygroup(GUN_GROUP) != GUN_NONE)
|
||||||
Vector vecGunAngles;
|
{
|
||||||
|
DropShockRoach();
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "common/bodysplat.wav", 1, ATTN_NORM );
|
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "common/bodysplat.wav", 1, ATTN_NORM );
|
||||||
@ -277,6 +273,19 @@ int CStrooper::Classify(void)
|
|||||||
return CLASS_ALIEN_MILITARY;
|
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
|
// HandleAnimEvent - catches the monster-specific messages
|
||||||
@ -288,34 +297,9 @@ void CStrooper::HandleAnimEvent(MonsterEvent_t *pEvent)
|
|||||||
{
|
{
|
||||||
case STROOPER_AE_DROP_GUN:
|
case STROOPER_AE_DROP_GUN:
|
||||||
{
|
{
|
||||||
Vector vecGunPos;
|
if (GetBodygroup(GUN_GROUP) != GUN_NONE)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
pRoach->pev->owner = edict();
|
DropShockRoach();
|
||||||
|
|
||||||
if (m_hEnemy)
|
|
||||||
pRoach->pev->angles = (pev->origin - m_hEnemy->pev->origin).Normalize();
|
|
||||||
|
|
||||||
// Remove any pitch.
|
|
||||||
pRoach->pev->angles.x = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -516,6 +500,8 @@ void CStrooper::Precache()
|
|||||||
|
|
||||||
PRECACHE_SOUND("zombie/claw_miss2.wav");// because we use the basemonster SWIPE animation event
|
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");
|
UTIL_PrecacheOther("monster_shockroach");
|
||||||
|
|
||||||
// get voice pitch
|
// 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
|
// SetActivity
|
||||||
|
@ -226,7 +226,7 @@ void CHeadCrab::HandleAnimEvent( MonsterEvent_t *pEvent )
|
|||||||
|
|
||||||
int iSound = RANDOM_LONG(0,2);
|
int iSound = RANDOM_LONG(0,2);
|
||||||
if( iSound != 0 )
|
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;
|
pev->velocity = vecJumpDir;
|
||||||
m_flNextAttack = gpGlobals->time + 2;
|
m_flNextAttack = gpGlobals->time + 2;
|
||||||
@ -320,7 +320,7 @@ void CHeadCrab::LeapTouch( CBaseEntity *pOther )
|
|||||||
// Don't hit if back on ground
|
// Don't hit if back on ground
|
||||||
if( !FBitSet( pev->flags, FL_ONGROUND ) )
|
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 );
|
pOther->TakeDamage( pev, pev, GetDamageAmount(), DMG_SLASH );
|
||||||
}
|
}
|
||||||
@ -348,7 +348,7 @@ void CHeadCrab::StartTask( Task_t *pTask )
|
|||||||
{
|
{
|
||||||
case TASK_RANGE_ATTACK1:
|
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;
|
m_IdealActivity = ACT_RANGE_ATTACK1;
|
||||||
SetTouch( &CHeadCrab::LeapTouch );
|
SetTouch( &CHeadCrab::LeapTouch );
|
||||||
break;
|
break;
|
||||||
@ -404,7 +404,7 @@ int CHeadCrab::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, floa
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CHeadCrab::IdleSound( void )
|
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 )
|
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 )
|
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 )
|
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 )
|
Schedule_t *CHeadCrab::GetScheduleOfType( int Type )
|
||||||
@ -455,7 +455,7 @@ public:
|
|||||||
BOOL CheckRangeAttack1( float flDot, float flDist );
|
BOOL CheckRangeAttack1( float flDot, float flDist );
|
||||||
Schedule_t *GetScheduleOfType ( int Type );
|
Schedule_t *GetScheduleOfType ( int Type );
|
||||||
virtual int GetVoicePitch( void ) { return PITCH_NORM + RANDOM_LONG( 40, 50 ); }
|
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 )
|
LINK_ENTITY_TO_CLASS( monster_babycrab, CBabyCrab )
|
||||||
|
@ -43,7 +43,7 @@ public:
|
|||||||
|
|
||||||
virtual float GetDamageAmount(void) { return gSkillData.headcrabDmgBite; }
|
virtual float GetDamageAmount(void) { return gSkillData.headcrabDmgBite; }
|
||||||
virtual int GetVoicePitch(void) { return 100; }
|
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);
|
Schedule_t* GetScheduleOfType(int Type);
|
||||||
|
|
||||||
CUSTOM_SCHEDULES
|
CUSTOM_SCHEDULES
|
||||||
|
@ -407,6 +407,11 @@ BOOL CHGrunt::CheckRangeAttack1( float flDot, float flDist )
|
|||||||
// attack.
|
// attack.
|
||||||
//=========================================================
|
//=========================================================
|
||||||
BOOL CHGrunt::CheckRangeAttack2( float flDot, float flDist )
|
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 ) ) )
|
if( !FBitSet( pev->weapons, ( HGRUNT_HANDGRENADE | HGRUNT_GRENADELAUNCHER ) ) )
|
||||||
{
|
{
|
||||||
|
@ -32,6 +32,7 @@ public:
|
|||||||
BOOL CheckMeleeAttack1(float flDot, float flDist);
|
BOOL CheckMeleeAttack1(float flDot, float flDist);
|
||||||
BOOL CheckRangeAttack1(float flDot, float flDist);
|
BOOL CheckRangeAttack1(float flDot, float flDist);
|
||||||
BOOL CheckRangeAttack2(float flDot, float flDist);
|
BOOL CheckRangeAttack2(float flDot, float flDist);
|
||||||
|
BOOL CheckRangeAttack2Impl( float grenadeSpeed, float flDot, float flDist );
|
||||||
void CheckAmmo(void);
|
void CheckAmmo(void);
|
||||||
void SetActivity(Activity NewActivity);
|
void SetActivity(Activity NewActivity);
|
||||||
void StartTask(Task_t *pTask);
|
void StartTask(Task_t *pTask);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user