Конференции   |   Вход   |   Участники   |   Календарь   |   Поиск Сообщения за день   |   Все разделы прочитаны   |   Правила

Вернуться   Global Half-Life | Форум > Конференция Panther Studios > Half-Life SDK: Кодинг > [ Кодинг ] Туториалы

Ответ
 
Опции темы
Kerard
User
Kerard вне форума
 
Регистрация: 23.11.2022
Сообщений: 16
Thumbs up Как заставить Барни перезаряжаться

Декомпилировать barney.mdl. Открыть файл barney.qc. Найти строку:
Код:
$sequence "reload" "reload" fps 15 ACT_RELOAD 1
Исправить на:
Код:
$sequence "reload" "reload" fps 15 ACT_RELOAD 1 { event 5 8 }
Скомпилировать.

Открыть файл barney.cpp.
Найти:
С / С++:
#define        BARNEY_AE_DRAW        ( 2 )
#define        BARNEY_AE_SHOOT        ( 3 )
#define        BARNEY_AE_HOLSTER    ( 4 ) 
Добавить в конце:
С / С++:
#define        BARNEY_AE_RELOAD    ( 5 ) 
Это эвент перезарядки.


Далее найти:
С / С++:
class CBarney : public CTalkMonster 
Там найти:
С / С++:
    // UNDONE: What is this for?  It isn't used?
    
float    m_flPlayerDamage;// how much pain has the player inflicted on me?

    
CUSTOM_SCHEDULES; 
Добавить перед ним
С / С++:
int m_iClipSize; 
Должно получится:
С / С++:
int m_iClipSize;

    
// UNDONE: What is this for?  It isn't used?
    
float    m_flPlayerDamage;// how much pain has the player inflicted on me?

    
CUSTOM_SCHEDULES; 
Далее найти:

С / С++:
LINK_ENTITY_TO_CLASS( monster_barney, CBarney );

TYPEDESCRIPTION    CBarney::m_SaveData[] = 
{
    
DEFINE_FIELD( CBarney, m_fGunDrawn, FIELD_BOOLEAN ),
    
DEFINE_FIELD( CBarney, m_painTime, FIELD_TIME ),
    
DEFINE_FIELD( CBarney, m_checkAttackTime, FIELD_TIME ),
    
DEFINE_FIELD( CBarney, m_lastAttackCheck, FIELD_BOOLEAN ),
    
DEFINE_FIELD( CBarney, m_flPlayerDamage, FIELD_FLOAT ), 
Добавить в конце:
С / С++:
DEFINE_FIELD( CBarney, m_iClipSize, FIELD_INTEGER ), 
Далее найти:
С / С++:
void CBarney :: Spawn() 
После
С / С++:
m_MonsterState        = MONSTERSTATE_NONE; 
Добавить:
С / С++:
    m_iClipSize            = 17; (или любое другое число; оно отвечает за размер обоймы)
    
m_cAmmoLoaded        = m_iClipSize; 

Далее найти:
void CBarney :: BarneyFirePistol ( void )
В нем найти:
С / С++:
// UNDONE: Reload?
    
m_cAmmoLoaded--;// take away a bullet! 
Добавить после:
С / С++:
    if ( m_cAmmoLoaded <=0 )
    
SetConditions(bits_COND_NO_AMMO_LOADED); 
Далее самое важное:
Найти:
С / С++:
Schedule_t *CBarney :: GetSchedule ( void ) 
В нем найти:
С / С++:
switch( m_MonsterState )
    {
    case 
MONSTERSTATE_COMBAT: 
И в нем после закрывающей фигурной скобки и ПРЯМО перед break; добавить:
С / С++:
//no ammo
    
if ( HasConditions ( bits_COND_NO_AMMO_LOADED ) )

    {
      return 
GetScheduleOfType ( SCHED_RELOAD );
    } 
Должно выглядить:

С / С++:
}
//no ammo
    
if ( HasConditions ( bits_COND_NO_AMMO_LOADED ) )

    {
      return 
GetScheduleOfType ( SCHED_RELOAD );
    }
    break; 

Далее найти:
С / С++:
void CBarney :: HandleAnimEvent( MonsterEvent_t *pEvent ) 
И по аналогии с остальными добавить:
С / С++:
case BARNEY_AE_RELOAD:
    
EMIT_SOUND(ENT(pev), CHAN_WEAPON, "barney/ba_reload1.wav", 1, ATTN_NORM );
    
m_cAmmoLoaded = ?; 
    
// (где "?" это количество выстрелов которое делает персонаж до перезарядки, может быть любое число)
    
ClearConditions ( bits_COND_NO_AMMO_LOADED );
    break; 
Далее найти:

С / С++:
void CBarney :: Precache() 
Добавить в конец:
С / С++:
PRECACHE_SOUND("barney/ba_reload1.wav"); 
Скомпилировать.
#1 Старый 24.11.2022, 19:11 Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

На основе Vbulletin