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;
// BUG - For some reason that still eludes me, grunts are completely unable to reload their weapons.
// 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!
m_cAmmoLoaded--;// take away a bullet!
Vector angDir = UTIL_VecToAngles( vecShootDir );
SetBlending( 0, angDir.x );
@@ -692,9 +690,7 @@ void CMHGrunt :: Shotgun ( void )
pev->effects |= EF_MUZZLEFLASH;
// BUG - For some reason that still eludes me, grunts are completely unable to reload their weapons.
// 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!
m_cAmmoLoaded--;// take away a bullet!
Vector angDir = UTIL_VecToAngles( vecShootDir );
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 )
{
@@ -1701,6 +1728,7 @@ DEFINE_CUSTOM_SCHEDULES( CMHGrunt )
slGruntRepel,
slGruntRepelAttack,
slGruntRepelLand,
slGruntChaseEnemyFailed,
};
IMPLEMENT_CUSTOM_SCHEDULES( CMHGrunt, CMBaseMonster );
@@ -1856,6 +1884,8 @@ Schedule_t *CMHGrunt :: GetSchedule( void )
// 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
@@ -1871,14 +1901,14 @@ Schedule_t *CMHGrunt :: GetSchedule( void )
if ((m_hEnemy != NULL) && UTIL_IsPlayer(m_hEnemy))
// player
SENTENCEG_PlayRndSz( ENT(pev), "HG_ALERT", HGRUNT_SENTENCE_VOLUME, GRUNT_ATTN, 0, m_voicePitch);
/*jlb
else if ((m_hEnemy != NULL) &&
(m_hEnemy->Classify() != CLASS_PLAYER_ALLY) &&
(m_hEnemy->Classify() != CLASS_HUMAN_PASSIVE) &&
(m_hEnemy->Classify() != CLASS_MACHINE))
// monster
SENTENCEG_PlayRndSz( ENT(pev), "HG_MONST", HGRUNT_SENTENCE_VOLUME, GRUNT_ATTN, 0, m_voicePitch);
jlb*/
JustSpoke();
}
@@ -1892,6 +1922,7 @@ jlb*/
}
}
}
*/
}
// no ammo
else if ( HasConditions ( bits_COND_NO_AMMO_LOADED ) )
@@ -1943,6 +1974,10 @@ jlb*/
// can shoot
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 ) )
{
// throw a grenade if can and no engage slots are available
@@ -1950,13 +1985,18 @@ jlb*/
}
else
{
return GetScheduleOfType( SCHED_RANGE_ATTACK1 );
// hide!
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY );
//return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY );
}
}
// can't see enemy
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 ) )
{
//!!!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 );
}
else
{
return GetScheduleOfType( SCHED_GRUNT_ESTABLISH_LINE_OF_FIRE );
}
/*
else
{
//!!!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
@@ -1979,6 +2024,7 @@ jlb*/
}
return GetScheduleOfType( SCHED_STANDOFF );
}
*/
}
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 ];
}
case SCHED_CHASE_ENEMY_FAILED:
{
// add missing schedule from squadmonster.cpp
return &slGruntChaseEnemyFailed[ 0 ];
}
default:
{
return CMBaseMonster :: GetScheduleOfType ( Type );

View File

@@ -120,9 +120,7 @@ void CMMassn::Sniperrifle(void)
pev->effects |= EF_MUZZLEFLASH;
// BUG - For some reason that still eludes me, grunts are completely unable to reload their weapons.
// 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!
m_cAmmoLoaded--;// take away a bullet!
Vector angDir = UTIL_VecToAngles(vecShootDir);
SetBlending(0, angDir.x);

View File

@@ -216,7 +216,7 @@ int CMStrooper::Classify()
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 )
@@ -730,6 +730,8 @@ Schedule_t *CMStrooper::GetSchedule(void)
// 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
// monster and has made it the squad's enemy. You
// 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 ))
// player
SENTENCEG_PlayRndSz(ENT(pev), "ST_ALERT", STROOPER_SENTENCE_VOLUME, STROOPER_ATTN, 0, m_voicePitch);
/*
else if ((m_hEnemy != 0) &&
(m_hEnemy->Classify() != CLASS_PLAYER_ALLY) &&
(m_hEnemy->Classify() != CLASS_HUMAN_PASSIVE) &&
(m_hEnemy->Classify() != CLASS_MACHINE))
// monster
SENTENCEG_PlayRndSz(ENT(pev), "ST_MONST", STROOPER_SENTENCE_VOLUME, STROOPER_ATTN, 0, m_voicePitch);
*/
JustSpoke();
}
@@ -762,6 +764,7 @@ Schedule_t *CMStrooper::GetSchedule(void)
{
return GetScheduleOfType(SCHED_STROOPER_ESTABLISH_LINE_OF_FIRE);
}
*/
}
// no ammo
else if (HasConditions(bits_COND_NO_AMMO_LOADED))
@@ -814,8 +817,10 @@ Schedule_t *CMStrooper::GetSchedule(void)
}
else
{
return GetScheduleOfType(SCHED_RANGE_ATTACK1);
// hide!
return GetScheduleOfType(SCHED_TAKE_COVER_FROM_ENEMY);
//return GetScheduleOfType(SCHED_TAKE_COVER_FROM_ENEMY);
}
}
// can't see enemy
@@ -832,6 +837,11 @@ Schedule_t *CMStrooper::GetSchedule(void)
return GetScheduleOfType(SCHED_RANGE_ATTACK2);
}
else
{
return GetScheduleOfType(SCHED_STROOPER_ESTABLISH_LINE_OF_FIRE);
}
/*
else
{
//!!!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
@@ -843,6 +853,7 @@ Schedule_t *CMStrooper::GetSchedule(void)
}
return GetScheduleOfType(SCHED_STANDOFF);
}
*/
}
if (HasConditions(bits_COND_SEE_ENEMY) && !HasConditions(bits_COND_CAN_RANGE_ATTACK1))