Fixed human grunts refusing to attack and refusing to reload.

This also fixes male assassins and shock troopers behaving erraticaly.
Probably the heavy weapons grunt becomes better, too.
This commit is contained in:
Giegue
2023-03-03 01:18:38 -03:00
parent 2140e3413d
commit 55dfee7d74
3 changed files with 76 additions and 16 deletions

View File

@@ -663,9 +663,7 @@ void CMHGrunt :: Shoot ( void )
pev->effects |= EF_MUZZLEFLASH; pev->effects |= EF_MUZZLEFLASH;
// BUG - For some reason that still eludes me, grunts are completely unable to reload their weapons. m_cAmmoLoaded--;// take away a bullet!
// As a temporary fix, give them infinite ammo. It will look bad I know... I gotta find a solution. -Giegue
//m_cAmmoLoaded--;// take away a bullet!
Vector angDir = UTIL_VecToAngles( vecShootDir ); Vector angDir = UTIL_VecToAngles( vecShootDir );
SetBlending( 0, angDir.x ); SetBlending( 0, angDir.x );
@@ -692,9 +690,7 @@ void CMHGrunt :: Shotgun ( void )
pev->effects |= EF_MUZZLEFLASH; pev->effects |= EF_MUZZLEFLASH;
// BUG - For some reason that still eludes me, grunts are completely unable to reload their weapons. m_cAmmoLoaded--;// take away a bullet!
// As a temporary fix, give them infinite ammo. It will look bad I know... I gotta find a solution. -Giegue
//m_cAmmoLoaded--;// take away a bullet!
Vector angDir = UTIL_VecToAngles( vecShootDir ); Vector angDir = UTIL_VecToAngles( vecShootDir );
SetBlending( 0, angDir.x ); SetBlending( 0, angDir.x );
@@ -1677,6 +1673,37 @@ Schedule_t slGruntRepelLand[] =
}, },
}; };
//=========================================================
// Chase enemy failure schedule
//=========================================================
Task_t tlGruntChaseEnemyFailed[] =
{
{ TASK_STOP_MOVING, (float)0 },
{ TASK_WAIT, (float)0.2 },
{ TASK_FIND_COVER_FROM_ENEMY, (float)0 },
{ TASK_RUN_PATH, (float)0 },
{ TASK_WAIT_FOR_MOVEMENT, (float)0 },
{ TASK_REMEMBER, (float)bits_MEMORY_INCOVER },
// { TASK_TURN_LEFT, (float)179 },
{ TASK_FACE_ENEMY, (float)0 },
{ TASK_WAIT, (float)1 },
};
Schedule_t slGruntChaseEnemyFailed[] =
{
{
tlGruntChaseEnemyFailed,
ARRAYSIZE ( tlGruntChaseEnemyFailed ),
bits_COND_NEW_ENEMY |
bits_COND_CAN_RANGE_ATTACK1 |
bits_COND_CAN_MELEE_ATTACK1 |
bits_COND_CAN_RANGE_ATTACK2 |
bits_COND_CAN_MELEE_ATTACK2 |
bits_COND_HEAR_SOUND,
0,
"GruntChaseEnemyFailed"
},
};
DEFINE_CUSTOM_SCHEDULES( CMHGrunt ) DEFINE_CUSTOM_SCHEDULES( CMHGrunt )
{ {
@@ -1701,6 +1728,7 @@ DEFINE_CUSTOM_SCHEDULES( CMHGrunt )
slGruntRepel, slGruntRepel,
slGruntRepelAttack, slGruntRepelAttack,
slGruntRepelLand, slGruntRepelLand,
slGruntChaseEnemyFailed,
}; };
IMPLEMENT_CUSTOM_SCHEDULES( CMHGrunt, CMBaseMonster ); IMPLEMENT_CUSTOM_SCHEDULES( CMHGrunt, CMBaseMonster );
@@ -1856,6 +1884,8 @@ Schedule_t *CMHGrunt :: GetSchedule( void )
// new enemy // new enemy
if ( HasConditions(bits_COND_NEW_ENEMY) ) if ( HasConditions(bits_COND_NEW_ENEMY) )
{ {
// none of this should take place as CSquadMonster functions were completely stripped. -Giegue
/*
{ {
{ {
//!!!KELLY - the leader of a squad of grunts has just seen the player or a //!!!KELLY - the leader of a squad of grunts has just seen the player or a
@@ -1871,14 +1901,14 @@ Schedule_t *CMHGrunt :: GetSchedule( void )
if ((m_hEnemy != NULL) && UTIL_IsPlayer(m_hEnemy)) if ((m_hEnemy != NULL) && UTIL_IsPlayer(m_hEnemy))
// player // player
SENTENCEG_PlayRndSz( ENT(pev), "HG_ALERT", HGRUNT_SENTENCE_VOLUME, GRUNT_ATTN, 0, m_voicePitch); SENTENCEG_PlayRndSz( ENT(pev), "HG_ALERT", HGRUNT_SENTENCE_VOLUME, GRUNT_ATTN, 0, m_voicePitch);
/*jlb
else if ((m_hEnemy != NULL) && else if ((m_hEnemy != NULL) &&
(m_hEnemy->Classify() != CLASS_PLAYER_ALLY) && (m_hEnemy->Classify() != CLASS_PLAYER_ALLY) &&
(m_hEnemy->Classify() != CLASS_HUMAN_PASSIVE) && (m_hEnemy->Classify() != CLASS_HUMAN_PASSIVE) &&
(m_hEnemy->Classify() != CLASS_MACHINE)) (m_hEnemy->Classify() != CLASS_MACHINE))
// monster // monster
SENTENCEG_PlayRndSz( ENT(pev), "HG_MONST", HGRUNT_SENTENCE_VOLUME, GRUNT_ATTN, 0, m_voicePitch); SENTENCEG_PlayRndSz( ENT(pev), "HG_MONST", HGRUNT_SENTENCE_VOLUME, GRUNT_ATTN, 0, m_voicePitch);
jlb*/
JustSpoke(); JustSpoke();
} }
@@ -1892,6 +1922,7 @@ jlb*/
} }
} }
} }
*/
} }
// no ammo // no ammo
else if ( HasConditions ( bits_COND_NO_AMMO_LOADED ) ) else if ( HasConditions ( bits_COND_NO_AMMO_LOADED ) )
@@ -1943,6 +1974,10 @@ jlb*/
// can shoot // can shoot
else if ( HasConditions ( bits_COND_CAN_RANGE_ATTACK1 ) ) else if ( HasConditions ( bits_COND_CAN_RANGE_ATTACK1 ) )
{ {
// lack of CSquadMonster functionality makes hgrunt behave erraticaly as is removes
// core conditions to make them attack (OccupySlot). -Giegue
// check if a grenade can be thrown, otherwise force weapon fire.
if ( HasConditions ( bits_COND_CAN_RANGE_ATTACK2 ) ) if ( HasConditions ( bits_COND_CAN_RANGE_ATTACK2 ) )
{ {
// throw a grenade if can and no engage slots are available // throw a grenade if can and no engage slots are available
@@ -1950,13 +1985,18 @@ jlb*/
} }
else else
{ {
return GetScheduleOfType( SCHED_RANGE_ATTACK1 );
// hide! // hide!
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY ); //return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY );
} }
} }
// can't see enemy // can't see enemy
else if ( HasConditions( bits_COND_ENEMY_OCCLUDED ) ) else if ( HasConditions( bits_COND_ENEMY_OCCLUDED ) )
{ {
// missing CSquadMonster functions means that the monster will stand still if its enemy is out of sight
// and if it is impossible to throw a grenade. force it to chase the enemy if attack isn't possible
// -Giegue
if ( HasConditions( bits_COND_CAN_RANGE_ATTACK2 ) ) if ( HasConditions( bits_COND_CAN_RANGE_ATTACK2 ) )
{ {
//!!!KELLY - this grunt is about to throw or fire a grenade at the player. Great place for "fire in the hole" "frag out" etc //!!!KELLY - this grunt is about to throw or fire a grenade at the player. Great place for "fire in the hole" "frag out" etc
@@ -1968,6 +2008,11 @@ jlb*/
return GetScheduleOfType( SCHED_RANGE_ATTACK2 ); return GetScheduleOfType( SCHED_RANGE_ATTACK2 );
} }
else else
{
return GetScheduleOfType( SCHED_GRUNT_ESTABLISH_LINE_OF_FIRE );
}
/*
else
{ {
//!!!KELLY - grunt is going to stay put for a couple seconds to see if //!!!KELLY - grunt is going to stay put for a couple seconds to see if
// the enemy wanders back out into the open, or approaches the // the enemy wanders back out into the open, or approaches the
@@ -1979,6 +2024,7 @@ jlb*/
} }
return GetScheduleOfType( SCHED_STANDOFF ); return GetScheduleOfType( SCHED_STANDOFF );
} }
*/
} }
if ( HasConditions( bits_COND_SEE_ENEMY ) && !HasConditions ( bits_COND_CAN_RANGE_ATTACK1 ) ) if ( HasConditions( bits_COND_SEE_ENEMY ) && !HasConditions ( bits_COND_CAN_RANGE_ATTACK1 ) )
@@ -2113,6 +2159,11 @@ Schedule_t* CMHGrunt :: GetScheduleOfType ( int Type )
{ {
return &slGruntRepelLand[ 0 ]; return &slGruntRepelLand[ 0 ];
} }
case SCHED_CHASE_ENEMY_FAILED:
{
// add missing schedule from squadmonster.cpp
return &slGruntChaseEnemyFailed[ 0 ];
}
default: default:
{ {
return CMBaseMonster :: GetScheduleOfType ( Type ); return CMBaseMonster :: GetScheduleOfType ( Type );

View File

@@ -120,9 +120,7 @@ void CMMassn::Sniperrifle(void)
pev->effects |= EF_MUZZLEFLASH; pev->effects |= EF_MUZZLEFLASH;
// BUG - For some reason that still eludes me, grunts are completely unable to reload their weapons. m_cAmmoLoaded--;// take away a bullet!
// As a temporary fix, give them infinite ammo. It will look bad I know... I gotta find a solution. -Giegue
//m_cAmmoLoaded--;// take away a bullet!
Vector angDir = UTIL_VecToAngles(vecShootDir); Vector angDir = UTIL_VecToAngles(vecShootDir);
SetBlending(0, angDir.x); SetBlending(0, angDir.x);

View File

@@ -216,7 +216,7 @@ int CMStrooper::Classify()
BOOL CMStrooper::CheckRangeAttack1(float flDot, float flDist) BOOL CMStrooper::CheckRangeAttack1(float flDot, float flDist)
{ {
return m_cAmmoLoaded >= 1;// && CMHGrunt::CheckRangeAttack1(flDot, flDist); return (m_cAmmoLoaded >= 1) && CMHGrunt::CheckRangeAttack1(flDot, flDist);
} }
BOOL CMStrooper::CheckRangeAttack2( float flDot, float flDist ) BOOL CMStrooper::CheckRangeAttack2( float flDot, float flDist )
@@ -730,6 +730,8 @@ Schedule_t *CMStrooper::GetSchedule(void)
// new enemy // new enemy
if (HasConditions(bits_COND_NEW_ENEMY)) if (HasConditions(bits_COND_NEW_ENEMY))
{ {
// pretty much a copypaste of hgrunt and so the same issues. -Giegue
/*
//!!!KELLY - the leader of a squad of grunts has just seen the player or a //!!!KELLY - the leader of a squad of grunts has just seen the player or a
// monster and has made it the squad's enemy. You // monster and has made it the squad's enemy. You
// can check pev->flags for FL_CLIENT to determine whether this is the player // can check pev->flags for FL_CLIENT to determine whether this is the player
@@ -743,14 +745,14 @@ Schedule_t *CMStrooper::GetSchedule(void)
if ((m_hEnemy != 0) && UTIL_IsPlayer( m_hEnemy )) if ((m_hEnemy != 0) && UTIL_IsPlayer( m_hEnemy ))
// player // player
SENTENCEG_PlayRndSz(ENT(pev), "ST_ALERT", STROOPER_SENTENCE_VOLUME, STROOPER_ATTN, 0, m_voicePitch); SENTENCEG_PlayRndSz(ENT(pev), "ST_ALERT", STROOPER_SENTENCE_VOLUME, STROOPER_ATTN, 0, m_voicePitch);
/*
else if ((m_hEnemy != 0) && else if ((m_hEnemy != 0) &&
(m_hEnemy->Classify() != CLASS_PLAYER_ALLY) && (m_hEnemy->Classify() != CLASS_PLAYER_ALLY) &&
(m_hEnemy->Classify() != CLASS_HUMAN_PASSIVE) && (m_hEnemy->Classify() != CLASS_HUMAN_PASSIVE) &&
(m_hEnemy->Classify() != CLASS_MACHINE)) (m_hEnemy->Classify() != CLASS_MACHINE))
// monster // monster
SENTENCEG_PlayRndSz(ENT(pev), "ST_MONST", STROOPER_SENTENCE_VOLUME, STROOPER_ATTN, 0, m_voicePitch); SENTENCEG_PlayRndSz(ENT(pev), "ST_MONST", STROOPER_SENTENCE_VOLUME, STROOPER_ATTN, 0, m_voicePitch);
*/
JustSpoke(); JustSpoke();
} }
@@ -762,6 +764,7 @@ Schedule_t *CMStrooper::GetSchedule(void)
{ {
return GetScheduleOfType(SCHED_STROOPER_ESTABLISH_LINE_OF_FIRE); return GetScheduleOfType(SCHED_STROOPER_ESTABLISH_LINE_OF_FIRE);
} }
*/
} }
// no ammo // no ammo
else if (HasConditions(bits_COND_NO_AMMO_LOADED)) else if (HasConditions(bits_COND_NO_AMMO_LOADED))
@@ -814,8 +817,10 @@ Schedule_t *CMStrooper::GetSchedule(void)
} }
else else
{ {
return GetScheduleOfType(SCHED_RANGE_ATTACK1);
// hide! // hide!
return GetScheduleOfType(SCHED_TAKE_COVER_FROM_ENEMY); //return GetScheduleOfType(SCHED_TAKE_COVER_FROM_ENEMY);
} }
} }
// can't see enemy // can't see enemy
@@ -832,6 +837,11 @@ Schedule_t *CMStrooper::GetSchedule(void)
return GetScheduleOfType(SCHED_RANGE_ATTACK2); return GetScheduleOfType(SCHED_RANGE_ATTACK2);
} }
else else
{
return GetScheduleOfType(SCHED_STROOPER_ESTABLISH_LINE_OF_FIRE);
}
/*
else
{ {
//!!!KELLY - grunt is going to stay put for a couple seconds to see if //!!!KELLY - grunt is going to stay put for a couple seconds to see if
// the enemy wanders back out into the open, or approaches the // the enemy wanders back out into the open, or approaches the
@@ -843,6 +853,7 @@ Schedule_t *CMStrooper::GetSchedule(void)
} }
return GetScheduleOfType(SCHED_STANDOFF); return GetScheduleOfType(SCHED_STANDOFF);
} }
*/
} }
if (HasConditions(bits_COND_SEE_ENEMY) && !HasConditions(bits_COND_CAN_RANGE_ATTACK1)) if (HasConditions(bits_COND_SEE_ENEMY) && !HasConditions(bits_COND_CAN_RANGE_ATTACK1))