diff --git a/src/dlls/hgrunt.cpp b/src/dlls/hgrunt.cpp index 1f97329..6f6bcfa 100644 --- a/src/dlls/hgrunt.cpp +++ b/src/dlls/hgrunt.cpp @@ -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 ); diff --git a/src/dlls/massn.cpp b/src/dlls/massn.cpp index aa08dc9..1cc2b81 100644 --- a/src/dlls/massn.cpp +++ b/src/dlls/massn.cpp @@ -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); diff --git a/src/dlls/strooper.cpp b/src/dlls/strooper.cpp index 4bf7f10..09dc91d 100644 --- a/src/dlls/strooper.cpp +++ b/src/dlls/strooper.cpp @@ -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))