Browse Source

Add monster_human_grunt_ally, monster_nari_grunt and monster_zombie_grunt implementations.

residual_point
Night Owl 7 years ago
parent
commit
9a7fb0fcda
  1. 3
      dlls/CMakeLists.txt
  2. 129
      dlls/hgrunt.cpp
  3. 89
      dlls/hgrunt.h
  4. 1687
      dlls/rp/fgrunt.cpp
  5. 1581
      dlls/rp/ngrunt.cpp
  6. 1720
      dlls/rp/zgrunt.cpp
  7. 30
      dlls/zombie.cpp

3
dlls/CMakeLists.txt

@ -129,10 +129,13 @@ set (SVDLL_SOURCES @@ -129,10 +129,13 @@ set (SVDLL_SOURCES
zombie.cpp
rp/blkop_apache.cpp
rp/blkop_osprey.cpp
rp/fgrunt.cpp
rp/gonome.cpp
rp/massn.cpp
rp/ngrunt.cpp
rp/otis.cpp
rp/pitdrone.cpp
rp/zgrunt.cpp
../pm_shared/pm_debug.c
../pm_shared/pm_math.c
../pm_shared/pm_shared.c

129
dlls/hgrunt.cpp

@ -46,80 +46,6 @@ int g_fGruntQuestion; // true if an idle grunt asked a question. Cleared when @@ -46,80 +46,6 @@ int g_fGruntQuestion; // true if an idle grunt asked a question. Cleared when
extern DLL_GLOBAL int g_iSkillLevel;
//=========================================================
// monster-specific DEFINE's
//=========================================================
#define GRUNT_CLIP_SIZE 36 // how many bullets in a clip? - NOTE: 3 round burst sound, so keep as 3 * x!
#define GRUNT_VOL 0.35 // volume of grunt sounds
#define GRUNT_ATTN ATTN_NORM // attenutation of grunt sentences
#define HGRUNT_LIMP_HEALTH 20
#define HGRUNT_DMG_HEADSHOT ( DMG_BULLET | DMG_CLUB ) // damage types that can kill a grunt with a single headshot.
#define HGRUNT_NUM_HEADS 2 // how many grunt heads are there?
#define HGRUNT_MINIMUM_HEADSHOT_DAMAGE 15 // must do at least this much damage in one shot to head to score a headshot kill
#define HGRUNT_SENTENCE_VOLUME (float)0.35 // volume of grunt sentences
#define HGRUNT_9MMAR ( 1 << 0)
#define HGRUNT_HANDGRENADE ( 1 << 1)
#define HGRUNT_GRENADELAUNCHER ( 1 << 2)
#define HGRUNT_SHOTGUN ( 1 << 3)
#define HEAD_GROUP 1
#define HEAD_GRUNT 0
#define HEAD_COMMANDER 1
#define HEAD_SHOTGUN 2
#define HEAD_M203 3
#define GUN_GROUP 2
#define GUN_MP5 0
#define GUN_SHOTGUN 1
#define GUN_NONE 2
//=========================================================
// Monster's Anim Events Go Here
//=========================================================
#define HGRUNT_AE_RELOAD ( 2 )
#define HGRUNT_AE_KICK ( 3 )
#define HGRUNT_AE_BURST1 ( 4 )
#define HGRUNT_AE_BURST2 ( 5 )
#define HGRUNT_AE_BURST3 ( 6 )
#define HGRUNT_AE_GREN_TOSS ( 7 )
#define HGRUNT_AE_GREN_LAUNCH ( 8 )
#define HGRUNT_AE_GREN_DROP ( 9 )
#define HGRUNT_AE_CAUGHT_ENEMY ( 10 ) // grunt established sight with an enemy (player only) that had previously eluded the squad.
#define HGRUNT_AE_DROP_GUN ( 11 ) // grunt (probably dead) is dropping his mp5.
//=========================================================
// monster-specific schedule types
//=========================================================
enum
{
SCHED_GRUNT_SUPPRESS = LAST_COMMON_SCHEDULE + 1,
SCHED_GRUNT_ESTABLISH_LINE_OF_FIRE,// move to a location to set up an attack against the enemy. (usually when a friendly is in the way).
SCHED_GRUNT_COVER_AND_RELOAD,
SCHED_GRUNT_SWEEP,
SCHED_GRUNT_FOUND_ENEMY,
SCHED_GRUNT_REPEL,
SCHED_GRUNT_REPEL_ATTACK,
SCHED_GRUNT_REPEL_LAND,
SCHED_GRUNT_WAIT_FACE_ENEMY,
SCHED_GRUNT_TAKECOVER_FAILED,// special schedule type that forces analysis of conditions and picks the best possible schedule to recover from this type of failure.
SCHED_GRUNT_ELOF_FAIL
};
//=========================================================
// monster-specific tasks
//=========================================================
enum
{
TASK_GRUNT_FACE_TOSS_DIR = LAST_COMMON_TASK + 1,
TASK_GRUNT_SPEAK_SENTENCE,
TASK_GRUNT_CHECK_FIRE
};
//=========================================================
// monster-specific conditions
//=========================================================
#define bits_COND_GRUNT_NOFIRE ( bits_COND_SPECIAL1 )
LINK_ENTITY_TO_CLASS( monster_human_grunt, CHGrunt )
TYPEDESCRIPTION CHGrunt::m_SaveData[] =
@ -151,18 +77,6 @@ const char *CHGrunt::pGruntSentences[] = @@ -151,18 +77,6 @@ const char *CHGrunt::pGruntSentences[] =
"HG_TAUNT", // say rude things
};
typedef enum
{
HGRUNT_SENT_NONE = -1,
HGRUNT_SENT_GREN = 0,
HGRUNT_SENT_ALERT,
HGRUNT_SENT_MONSTER,
HGRUNT_SENT_COVER,
HGRUNT_SENT_THROW,
HGRUNT_SENT_CHARGE,
HGRUNT_SENT_TAUNT
} HGRUNT_SENTENCE_TYPES;
//=========================================================
// Speak Sentence - say your cued up sentence.
//
@ -647,7 +561,7 @@ void CHGrunt::IdleSound( void ) @@ -647,7 +561,7 @@ void CHGrunt::IdleSound( void )
SENTENCEG_PlayRndSz( ENT( pev ), "HG_CLEAR", HGRUNT_SENTENCE_VOLUME, ATTN_NORM, 0, m_voicePitch );
break;
case 2:
// question
// question
SENTENCEG_PlayRndSz( ENT( pev ), "HG_ANSWER", HGRUNT_SENTENCE_VOLUME, ATTN_NORM, 0, m_voicePitch );
break;
}
@ -859,7 +773,6 @@ void CHGrunt::HandleAnimEvent( MonsterEvent_t *pEvent ) @@ -859,7 +773,6 @@ void CHGrunt::HandleAnimEvent( MonsterEvent_t *pEvent )
else
{
Shotgun();
EMIT_SOUND( ENT( pev ), CHAN_WEAPON, "weapons/sbarrel1.wav", 1, ATTN_NORM );
}
@ -907,6 +820,7 @@ void CHGrunt::Spawn() @@ -907,6 +820,7 @@ void CHGrunt::Spawn()
Precache();
SET_MODEL( ENT( pev ), "models/hgrunt.mdl" );
UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
pev->solid = SOLID_SLIDEBOX;
@ -975,7 +889,7 @@ void CHGrunt::Precache() @@ -975,7 +889,7 @@ void CHGrunt::Precache()
PRECACHE_SOUND( "hgrunt/gr_mgun1.wav" );
PRECACHE_SOUND( "hgrunt/gr_mgun2.wav" );
PRECACHE_SOUND( "hgrunt/gr_die1.wav" );
PRECACHE_SOUND( "hgrunt/gr_die2.wav" );
PRECACHE_SOUND( "hgrunt/gr_die3.wav" );
@ -986,12 +900,10 @@ void CHGrunt::Precache() @@ -986,12 +900,10 @@ void CHGrunt::Precache()
PRECACHE_SOUND( "hgrunt/gr_pain4.wav" );
PRECACHE_SOUND( "hgrunt/gr_pain5.wav" );
PRECACHE_SOUND( "weapons/sbarrel1.wav" );
PRECACHE_SOUND( "hgrunt/gr_reload1.wav" );
PRECACHE_SOUND( "weapons/glauncher.wav" );
PRECACHE_SOUND( "weapons/sbarrel1.wav" );
PRECACHE_SOUND( "zombie/claw_miss2.wav" );// because we use the basemonster SWIPE animation event
// get voice pitch
@ -1097,23 +1009,22 @@ void CHGrunt::PainSound( void ) @@ -1097,23 +1009,22 @@ void CHGrunt::PainSound( void )
#endif
switch( RANDOM_LONG( 0, 6 ) )
{
case 0:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain3.wav", 1, ATTN_NORM );
case 0:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain3.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain4.wav", 1, ATTN_NORM );
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain4.wav", 1, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain5.wav", 1, ATTN_NORM );
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain5.wav", 1, ATTN_NORM );
break;
case 3:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain1.wav", 1, ATTN_NORM );
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain1.wav", 1, ATTN_NORM );
break;
case 4:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain2.wav", 1, ATTN_NORM );
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_pain2.wav", 1, ATTN_NORM );
break;
}
m_flNextPainTime = gpGlobals->time + 1;
}
}
@ -1126,13 +1037,13 @@ void CHGrunt::DeathSound( void ) @@ -1126,13 +1037,13 @@ void CHGrunt::DeathSound( void )
switch( RANDOM_LONG( 0, 2 ) )
{
case 0:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_die1.wav", 1, ATTN_IDLE );
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_die1.wav", 1, ATTN_IDLE );
break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_die2.wav", 1, ATTN_IDLE );
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_die2.wav", 1, ATTN_IDLE );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_die3.wav", 1, ATTN_IDLE );
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "hgrunt/gr_die3.wav", 1, ATTN_IDLE );
break;
}
}
@ -2290,6 +2201,7 @@ void CHGruntRepel::Spawn( void ) @@ -2290,6 +2201,7 @@ void CHGruntRepel::Spawn( void )
void CHGruntRepel::Precache( void )
{
UTIL_PrecacheOther( "monster_human_grunt" );
m_iSpriteTexture = PRECACHE_MODEL( "sprites/rope.spr" );
}
@ -2349,23 +2261,14 @@ void CDeadHGrunt::KeyValue( KeyValueData *pkvd ) @@ -2349,23 +2261,14 @@ void CDeadHGrunt::KeyValue( KeyValueData *pkvd )
}
LINK_ENTITY_TO_CLASS( monster_hgrunt_dead, CDeadHGrunt )
LINK_ENTITY_TO_CLASS( monster_human_grunt_ally_dead, CDeadHGrunt )
//=========================================================
// ********** DeadHGrunt SPAWN **********
//=========================================================
void CDeadHGrunt::Spawn( void )
{
if( FClassnameIs( pev, "monster_human_grunt_ally_dead" ) )
{
PRECACHE_MODEL( "models/hgrunt_opfor.mdl" );
SET_MODEL( ENT( pev ), "models/hgrunt_opfor.mdl" );
}
else
{
PRECACHE_MODEL( "models/hgrunt.mdl" );
SET_MODEL( ENT( pev ), "models/hgrunt.mdl" );
}
PRECACHE_MODEL( "models/hgrunt.mdl" );
SET_MODEL( ENT( pev ), "models/hgrunt.mdl" );
pev->effects = 0;
pev->yaw_speed = 8;

89
dlls/hgrunt.h

@ -15,6 +15,80 @@ @@ -15,6 +15,80 @@
#ifndef HGRUNT_H
#define HGRUNT_H
//=========================================================
// monster-specific DEFINE's
//=========================================================
#define GRUNT_CLIP_SIZE 36 // how many bullets in a clip? - NOTE: 3 round burst sound, so keep as 3 * x!
#define GRUNT_VOL 0.35 // volume of grunt sounds
#define GRUNT_ATTN ATTN_NORM // attenutation of grunt sentences
#define HGRUNT_LIMP_HEALTH 20
#define HGRUNT_DMG_HEADSHOT ( DMG_BULLET | DMG_CLUB ) // damage types that can kill a grunt with a single headshot.
#define HGRUNT_NUM_HEADS 2 // how many grunt heads are there?
#define HGRUNT_MINIMUM_HEADSHOT_DAMAGE 15 // must do at least this much damage in one shot to head to score a headshot kill
#define HGRUNT_SENTENCE_VOLUME (float)0.35 // volume of grunt sentences
#define HGRUNT_9MMAR ( 1 << 0)
#define HGRUNT_HANDGRENADE ( 1 << 1)
#define HGRUNT_GRENADELAUNCHER ( 1 << 2)
#define HGRUNT_SHOTGUN ( 1 << 3)
#define HEAD_GROUP 1
#define HEAD_GRUNT 0
#define HEAD_COMMANDER 1
#define HEAD_SHOTGUN 2
#define HEAD_M203 3
#define GUN_GROUP 2
#define GUN_MP5 0
#define GUN_SHOTGUN 1
#define GUN_NONE 2
//=========================================================
// Monster's Anim Events Go Here
//=========================================================
#define HGRUNT_AE_RELOAD ( 2 )
#define HGRUNT_AE_KICK ( 3 )
#define HGRUNT_AE_BURST1 ( 4 )
#define HGRUNT_AE_BURST2 ( 5 )
#define HGRUNT_AE_BURST3 ( 6 )
#define HGRUNT_AE_GREN_TOSS ( 7 )
#define HGRUNT_AE_GREN_LAUNCH ( 8 )
#define HGRUNT_AE_GREN_DROP ( 9 )
#define HGRUNT_AE_CAUGHT_ENEMY ( 10 ) // grunt established sight with an enemy (player only) that had previously eluded the squad.
#define HGRUNT_AE_DROP_GUN ( 11 ) // grunt (probably dead) is dropping his mp5.
//=========================================================
// monster-specific schedule types
//=========================================================
enum
{
SCHED_GRUNT_SUPPRESS = LAST_COMMON_SCHEDULE + 1,
SCHED_GRUNT_ESTABLISH_LINE_OF_FIRE,// move to a location to set up an attack against the enemy. (usually when a friendly is in the way).
SCHED_GRUNT_COVER_AND_RELOAD,
SCHED_GRUNT_SWEEP,
SCHED_GRUNT_FOUND_ENEMY,
SCHED_GRUNT_REPEL,
SCHED_GRUNT_REPEL_ATTACK,
SCHED_GRUNT_REPEL_LAND,
SCHED_GRUNT_WAIT_FACE_ENEMY,
SCHED_GRUNT_TAKECOVER_FAILED,// special schedule type that forces analysis of conditions and picks the best possible schedule to recover from this type of failure.
SCHED_GRUNT_ELOF_FAIL
};
//=========================================================
// monster-specific tasks
//=========================================================
enum
{
TASK_GRUNT_FACE_TOSS_DIR = LAST_COMMON_TASK + 1,
TASK_GRUNT_SPEAK_SENTENCE,
TASK_GRUNT_CHECK_FIRE
};
//=========================================================
// monster-specific conditions
//=========================================================
#define bits_COND_GRUNT_NOFIRE ( bits_COND_SPECIAL1 )
//=========================================================
// hgrunt
//=========================================================
@ -40,7 +114,7 @@ public: @@ -40,7 +114,7 @@ public:
virtual void IdleSound(void);
Vector GetGunPosition(void);
void Shoot(void);
void Shotgun(void);
virtual void Shotgun(void);
void PrescheduleThink(void);
virtual void GibMonster(void);
virtual void SpeakSentence(void);
@ -54,7 +128,7 @@ public: @@ -54,7 +128,7 @@ public:
void TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
int TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType);
int IRelationship(CBaseEntity *pTarget);
virtual int IRelationship(CBaseEntity *pTarget);
virtual BOOL FOkToSpeak(void);
void JustSpoke(void);
@ -85,6 +159,17 @@ public: @@ -85,6 +159,17 @@ public:
static const char *pGruntSentences[];
};
typedef enum
{
HGRUNT_SENT_NONE = -1,
HGRUNT_SENT_GREN = 0,
HGRUNT_SENT_ALERT,
HGRUNT_SENT_MONSTER,
HGRUNT_SENT_COVER,
HGRUNT_SENT_THROW,
HGRUNT_SENT_CHARGE,
HGRUNT_SENT_TAUNT
} HGRUNT_SENTENCE_TYPES;
//=========================================================
// CHGruntRepel - when triggered, spawns a monster_human_grunt

1687
dlls/rp/fgrunt.cpp

File diff suppressed because it is too large Load Diff

1581
dlls/rp/ngrunt.cpp

File diff suppressed because it is too large Load Diff

1720
dlls/rp/zgrunt.cpp

File diff suppressed because it is too large Load Diff

30
dlls/zombie.cpp

@ -37,7 +37,6 @@ @@ -37,7 +37,6 @@
LINK_ENTITY_TO_CLASS( monster_zombie, CZombie )
LINK_ENTITY_TO_CLASS( monster_zombie_barney, CZombie )
LINK_ENTITY_TO_CLASS( monster_zombie_soldier, CZombie )
LINK_ENTITY_TO_CLASS( monster_zombie_grunt, CZombie )
const char *CZombie::pAttackHitSounds[] =
{
@ -244,8 +243,6 @@ void CZombie::Spawn() @@ -244,8 +243,6 @@ void CZombie::Spawn()
SET_MODEL( ENT( pev ), "models/zombie_barney.mdl" );
else if( FClassnameIs( pev, "monster_zombie_soldier" ) )
SET_MODEL( ENT( pev ), "models/zombie_soldier.mdl" );
else if( FClassnameIs( pev, "monster_zombie_grunt" ) )
SET_MODEL( ENT( pev ), "models/zgrunt.mdl" );
else
SET_MODEL( ENT( pev ), "models/zombie.mdl" );
UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
@ -273,8 +270,6 @@ void CZombie::Precache() @@ -273,8 +270,6 @@ void CZombie::Precache()
PRECACHE_MODEL( "models/zombie_barney.mdl" );
else if( FClassnameIs( pev, "monster_zombie_soldier" ) )
PRECACHE_MODEL( "models/zombie_soldier.mdl" );
else if( FClassnameIs( pev, "monster_zombie_grunt" ) )
PRECACHE_MODEL( "models/zgrunt.mdl" );
else
PRECACHE_MODEL( "models/zombie.mdl" );
@ -326,9 +321,9 @@ int CZombie::IgnoreConditions( void ) @@ -326,9 +321,9 @@ int CZombie::IgnoreConditions( void )
}
//=========================================================
// DEAD ZGRUNT PROP
// DEAD ZSOLDIER PROP
//=========================================================
class CDeadZGrunt : public CBaseMonster
class CDeadZSoldier : public CBaseMonster
{
public:
void Spawn();
@ -340,13 +335,13 @@ public: @@ -340,13 +335,13 @@ public:
static char *m_szPoses[2];
};
char *CDeadZGrunt::m_szPoses[] =
char *CDeadZSoldier::m_szPoses[] =
{
"dead_on_back",
"dead_on_stomach"
};
void CDeadZGrunt::KeyValue( KeyValueData *pkvd )
void CDeadZSoldier::KeyValue( KeyValueData *pkvd )
{
if( FStrEq( pkvd->szKeyName, "pose" ) )
{
@ -357,24 +352,15 @@ void CDeadZGrunt::KeyValue( KeyValueData *pkvd ) @@ -357,24 +352,15 @@ void CDeadZGrunt::KeyValue( KeyValueData *pkvd )
CBaseMonster::KeyValue( pkvd );
}
LINK_ENTITY_TO_CLASS( monster_zombie_soldier_dead, CDeadZGrunt )
LINK_ENTITY_TO_CLASS( monster_zgrunt_dead, CDeadZGrunt )
LINK_ENTITY_TO_CLASS( monster_zombie_soldier_dead, CDeadZSoldier )
//=========================================================
// ********** DeadZGrunt SPAWN **********
//=========================================================
void CDeadZGrunt::Spawn()
void CDeadZSoldier::Spawn()
{
if( FClassnameIs( pev, "monster_zgrunt_dead" ) )
{
PRECACHE_MODEL( "models/zgrunt.mdl" );
SET_MODEL( ENT( pev ), "models/zgrunt.mdl" );
}
else
{
PRECACHE_MODEL( "models/zombie_soldier.mdl" );
SET_MODEL( ENT( pev ), "models/zombie_soldier.mdl" );
}
PRECACHE_MODEL( "models/zombie_soldier.mdl" );
SET_MODEL( ENT( pev ), "models/zombie_soldier.mdl" );
pev->effects = 0;
pev->yaw_speed = 8;

Loading…
Cancel
Save