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

Вернуться   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_CLASSmonster_barneyCBarney );

TYPEDESCRIPTION    CBarney::m_SaveData[] = 
{
    
DEFINE_FIELDCBarneym_fGunDrawnFIELD_BOOLEAN ),
    
DEFINE_FIELDCBarneym_painTimeFIELD_TIME ),
    
DEFINE_FIELDCBarneym_checkAttackTimeFIELD_TIME ),
    
DEFINE_FIELDCBarneym_lastAttackCheckFIELD_BOOLEAN ),
    
DEFINE_FIELDCBarneym_flPlayerDamageFIELD_FLOAT ), 
Добавить в конце:
С / С++:
DEFINE_FIELDCBarneym_iClipSizeFIELD_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 <=)
    
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 :: HandleAnimEventMonsterEvent_t *pEvent 
И по аналогии с остальными добавить:
С / С++:
case BARNEY_AE_RELOAD:
    
EMIT_SOUND(ENT(pev), CHAN_WEAPON"barney/ba_reload1.wav"1ATTN_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