Эй ребятки, замечали когда-нибудь в hl2, что комбайны стреляют как курица лапой, а у повстанцев всё летит в яблочко? И что, например, в garrysmod вообще никто никогда не может в вас попасть?
Что ж, раз мне всегда было интересно копать ИИ, чё б и не поделиться. ;D
Повторяю, это относится только к пушкам NPC, НЕ ИГРОКА!
Сейчас я вам расскажу про такую интересную фичу, как "регулятор точности стрельбы персонажей или WeaponProficiency", пригодится тем, кто создаёт моды на source.
Итак, у нас есть 5 видов "точностей", в общем о них:
WEAPON_PROFICIENCY_POOR
Это полное говно, в garrysmod'e зачем-то его поставили у всех комбинов. При такой "точности" NPC практически никогда не попадает в цель.
WEAPON_PROFICIENCY_AVERAGE
Типа средняя, только вот нифига она не средняя. Такое же говно, как и poor.
WEAPON_PROFICIENCY_GOOD
Вот эту я бы назвал средней. При ней NPC хотябы редко попадает.
WEAPON_PROFICIENCY_VERY_GOOD
NPC часто попадает в цель. Промахов и попаданий примерно 50х50%.
WEAPON_PROFICIENCY_PERFECT
Редко мажут и практически всегда попадают в яблочко.
Но дело в том, что для разных пушек эта фигня работает по разному. Вот пушки доступные npc в hl2:
weapon_alyxgun - пушка Аликс
weapon_pistol - пистолет 9 мм
weapon_smg1 - автомат
weapon_ar2 - импульсная винтовка
weapon_shotgun - дробовик
weapon_rpg - гранатомёт
Теперь рекомендуемые значения "точности" для них (да, я все их тестировал):
weapon_alyxgun
Только perfect, так как это пушка одного из глав. героев.
weapon_pistol
poor - как ни странно, пистолет в этом плане самый точный. poor будет являться для него средним значением, а perfect точным. Промежуточные никогда не ставьте, потому что разницы не будет никакой. POOR или PERFECT - на выбор - средняя или высокая точности.
weapon_smg1
У него уже побольше выбора:
perfect - в яблочко
very_good - редко мажет
good - предел, часто мажет
При значениях poor или average для автомата npc ни во что никогда не попадёт.
weapon_ar2
Почти то же, что у автомата, но никогда не ставьте perfect. Дело в том, что импульсовка по природе точнее smg и значение при perfect уходит в "минус 1 градус разброса". Хз как это работает, но игра может даже глючить.
Итак:
GOOD или VERY_GOOD - прилично или всегда в яблочко.
wepon_shotgun и weapon_rpg
Всегда perfect и точка. Дроб - самый неточный, и требует высокое значение. RPG - вы хотите, чтоб повстанцы мазали мимо страйдера или не стреляли вовсе? Я - нет, ставим perfect.
Вот коды оригинала для персов: 1 - солдаты альянса, 2 - метрокопы, 3 - все повстанцы, включая всяких Барни и Аликс.
1. npc_combine.cpp
code:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
WeaponProficiency_t CNPC_Combine::CalcWeaponProficiency( CBaseCombatWeapon *pWeapon )
{
if( FClassnameIs( pWeapon, "weapon_ar2" ) )
{
if( hl2_episodic.GetBool() )
{
return WEAPON_PROFICIENCY_VERY_GOOD;
}
else
{
return WEAPON_PROFICIENCY_GOOD;
}
}
else if( FClassnameIs( pWeapon, "weapon_shotgun" ) )
{
if( m_nSkin != COMBINE_SKIN_SHOTGUNNER )
{
m_nSkin = COMBINE_SKIN_SHOTGUNNER;
}
return WEAPON_PROFICIENCY_PERFECT;
}
else if( FClassnameIs( pWeapon, "weapon_smg1" ) )
{
return WEAPON_PROFICIENCY_GOOD;
}
return BaseClass::CalcWeaponProficiency( pWeapon );
}
2. npc_metropolice.cpp
code:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
WeaponProficiency_t CNPC_MetroPolice::CalcWeaponProficiency( CBaseCombatWeapon *pWeapon )
{
if( FClassnameIs( pWeapon, "weapon_pistol" ) )
{
return WEAPON_PROFICIENCY_POOR;
}
if( FClassnameIs( pWeapon, "weapon_smg1" ) )
{
return WEAPON_PROFICIENCY_VERY_GOOD;
}
return BaseClass::CalcWeaponProficiency( pWeapon );
}
3. npc_playercompanion.cpp
code:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
WeaponProficiency_t CNPC_PlayerCompanion::CalcWeaponProficiency( CBaseCombatWeapon *pWeapon )
{
if( FClassnameIs( pWeapon, "weapon_ar2" ) )
{
return WEAPON_PROFICIENCY_VERY_GOOD;
}
return WEAPON_PROFICIENCY_PERFECT;
}
Как видите, повстанцы почему-то стреляют лучше комбинов, особенно НЕ в эпизодах. Предлагаю завязать всё на уровнях сложности игры, чтоб точность стрельбы npc можно было регулировать, а также на типах персов.
1. npc_combine.cpp
code:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
WeaponProficiency_t CNPC_Combine::CalcWeaponProficiency( CBaseCombatWeapon *pWeapon )
{
if( FClassnameIs( pWeapon, "weapon_ar2" ) )
{
if( IsElite() || hl2_episodic.GetBool() )
{
return WEAPON_PROFICIENCY_VERY_GOOD;
}
else
{
return WEAPON_PROFICIENCY_GOOD;
}
}
else if( FClassnameIs( pWeapon, "weapon_shotgun" ) )
{
if( m_nSkin != COMBINE_SKIN_SHOTGUNNER )
{
m_nSkin = COMBINE_SKIN_SHOTGUNNER;
}
return WEAPON_PROFICIENCY_PERFECT;
}
else if( FClassnameIs( pWeapon, "weapon_smg1" ) )
{
if( g_pGameRules->IsSkillLevel(SKILL_EASY) )
{
return WEAPON_PROFICIENCY_GOOD;
}
else
{
return WEAPON_PROFICIENCY_VERY_GOOD;
}
}
return BaseClass::CalcWeaponProficiency( pWeapon );
}
Да, и пусть солдаты ещё и умеют стрелять подстволкой автомата на среднем и высоком уровнях сложности. О том как скомпили-ть модельку солдата, которая может так стрелять, описано здесь:
https://bbs.nashalife.ru/showthread...;threadid=58002
Только после Weapon_OwnsThisType( "weapon_smg1" ) допишите ещё " && !g_pGameRules->IsSkillLevel(SKILL_EASY)"
2. npc_metropolice.cpp
code:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
WeaponProficiency_t CNPC_MetroPolice::CalcWeaponProficiency( CBaseCombatWeapon *pWeapon )
{
if ( g_pGameRules->IsSkillLevel(SKILL_EASY) || m_bSimpleCops )
{
if( FClassnameIs( pWeapon, "weapon_pistol" ) )
{
return WEAPON_PROFICIENCY_POOR;
}
if( FClassnameIs( pWeapon, "weapon_smg1" ) )
{
return WEAPON_PROFICIENCY_VERY_GOOD;
}
}
else
{
return WEAPON_PROFICIENCY_PERFECT;
}
return BaseClass::CalcWeaponProficiency( pWeapon );
}
3. npc_playercompanion.cpp
code:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
WeaponProficiency_t CNPC_PlayerCompanion::CalcWeaponProficiency( CBaseCombatWeapon *pWeapon )
{
if( g_pGameRules->IsSkillLevel(SKILL_EASY) || Classify() == CLASS_PLAYER_ALLY_VITAL || m_bGameEndAlly )
{
if( FClassnameIs( pWeapon, "weapon_ar2" ) )
{
return WEAPON_PROFICIENCY_VERY_GOOD;
}
return WEAPON_PROFICIENCY_PERFECT;
}
else
{
if( FClassnameIs( pWeapon, "weapon_rpg" ) )
{
return WEAPON_PROFICIENCY_PERFECT;
}
if( FClassnameIs( pWeapon, "weapon_shotgun" ) )
{
return WEAPON_PROFICIENCY_PERFECT;
}
return WEAPON_PROFICIENCY_GOOD;
}
return BaseClass::CalcWeaponProficiency( pWeapon );
}
Вот, теперь всё встало на свои места.
Комбины стреляют лучше ситизенов, если уровень сложности не лёгкий. Это естественно касается только обычных повстанцев, но не глав. героев, типа Барни. Герои всегда стреляют отлично. Также элита стреляет лучше обычных солдат.
Вальвы должны были всё это учесть, но, видимо, им было лень и они по-моему всё оставили для лёгкого.
Ладно, всем спасибо!
Надеюсь, моё долбаное исследование кому-нибудь пригодится.