HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- как создать третью атаку ? (https://hlfx.ru/forum/showthread.php?threadid=5625)
Отправлено илья2 27-02-2021 в 21:59:
как создать третью атаку ?
как создать третью атаку например thirdattack чтоб автомат чем то другим выстреливал ? на примере модов rocketcrowbar и ssh.
Добавлено 27-02-2021 в 21:45:
и ещё кое что такое in_buttons.h и почему у меня из за него нечего не получается ?
Добавлено 28-02-2021 в 00:59:
все я все понял получилось:сейчас хочу показать свой тутор как же все таки сделать третью атаку можно и 4 и 5 итд.
так заходим в weapons.h находим функцию virtual void SecondaryAttack( void ) { return; } // do "+ATTACK2"
это сами атаки и ставим в низ перед дней
virtual void TertiaryAttack( void ) { return; } // do "+ATTACK3"
с weapons.h покончено идём в weapons.cpp ищем функцию
if ((m_pPlayer->pev->button & IN_ATTACK2) && CanAttack( m_flNextSecondaryAttack, gpGlobals->time, UseDecrement() ) )
ставим сверху после ItemPostFrame вот это
if ((m_pPlayer->pev->button & IN_ATTACK3) && CanAttack( m_flNextPrimaryAttack, gpGlobals->time, UseDecrement() ) )
{
if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) )
{
m_fFireOnEmpty = TRUE;
}
m_pPlayer->TabulateAmmo();
TertiaryAttack();
}
потом надо в if ((m_pPlayer->pev->button & IN_ATTACK2)итд поставить else->else if ((m_pPlayer->pev->button & IN_ATTACK2)итд
потом идём в else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) ставим третию атаку else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2|IN_ATTACK3) ) )
с dlls все идем в common и ищем in_buttons.h из за которого у меня были проблемы
перед #define IN_SCORE (1 << 15) не после а перед ставим #define IN_ATTACK3 (1 << 15)
обязательно надо поставить цифры по возрастанию IN_ATTACK3 (1 << 15) IN_SCORE (1 << 16)
теперь идем в cl_dll заходим в input.cpp там как раз и есть все бинды итд ищем kbutton_t in_attack2; ставим после kbutton_t in_attack3;
потом ищем
void IN_Attack2Down(void)
{
KeyDown(&in_attack2);
gHUD.m_Spectator.HandleButtonsDown( IN_ATTACK2 );
}
ставим
void IN_Attack3Down(void)
{
KeyDown(&in_attack3);
gHUD.m_Spectator.HandleButtonsDown( IN_ATTACK3 );
}
потом после void IN_Attack2Up(void) {KeyUp(&in_attack2);} ставим void IN_Attack3Up(void) {KeyUp(&in_attack3);}
потом ищем int CL_ButtonBits( int bResetState ) можно поставить везде наверное если не глюканёт как у меня
if (in_attack3.state & 3)
{
bits |= IN_ATTACK3;
}
потом ищем if ( bResetState )
ставим там in_attack3.state &= ~2;
потом void InitInput (void)
находим
gEngfuncs.pfnAddCommand ("+attack2", IN_Attack2Down);
gEngfuncs.pfnAddCommand ("-attack2", IN_Attack2Up);
и ставим после него
gEngfuncs.pfnAddCommand ("+attack3", IN_Attack3Down);
gEngfuncs.pfnAddCommand ("-attack3", IN_Attack3Up);
потом это ещё не все идем в hl_weapons.cpp ищем вот это
if ((m_pPlayer->pev->button & IN_ATTACK2) && (m_flNextSecondaryAttack <= 0.0))
{
if ( pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()] )
{
m_fFireOnEmpty = TRUE;
}
SecondaryAttack();
m_pPlayer->pev->button &= ~IN_ATTACK2;
}
потом после ItemPostFrame ставим вот это
if ((m_pPlayer->pev->button & IN_ATTACK3) && (m_flNextPrimaryAttack <= 0.0))
{
if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) )
{
m_fFireOnEmpty = TRUE;
}
TertiaryAttack();
}
и надо поставить else if после этой функции
потом находим else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) и добавляем 3 атаку
else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2|IN_ATTACK3) ) )
На этом все спасибо за внимание всего наилучшего
__________________
илья
Отправлено Ku2zoff 28-02-2021 в 05:08:
Цитата:
илья2 писал:
перед #define IN_SCORE (1 << 15) не после а перед ставим #define IN_ATTACK3 (1 << 15)
Если я ничего не путаю, то можно добавить ещё 17 кнопок, вплоть до IN_BLABLABLA (1 << 31). И необязательно их добавлять перед IN_SCORE.Цитата:
илья2 писал:
if ((m_pPlayer->pev->button & IN_ATTACK3) && CanAttack( m_flNextPrimaryAttack, gpGlobals->time, UseDecrement() ) )
Тут стоило бы использовать m_flNextTertiaryAttack.
Для чего вообще нужна третичная атака? В халфе не у каждого оружия есть даже вторичная. Хотя, на неё можно поставить вкл/выкл лазер, айронсайт, удар прикладом, наконец.
Добавлено 28-02-2021 в 12:08:
Сейчас попробовал - больше 16 кнопок не добавить. Всё, что выше (1 << 15) игнорится. То есть, у илья2 скореборд в мультиплеере показывается только лишь потому, что из функций IN_ScoreDown и IN_ScoreUp в input.cpp вызываются функции вгуи_вьпорта. Байт IN_SCORE для кнопок не назначается. Ну это я ещё delta.lst не трогал, мб. там надо увеличить число.
Отправлено Aynekko 28-02-2021 в 05:19:
Цитата:
Ku2zoff писал:
Сейчас попробовал - больше 16 кнопок не добавить
Как-то это можно обойти на ксаше? У меня уже добавлен бег (тебе спасибо), потом я еще добавил дэш - но, так как по кнопкам лимит, мне пришлось заюзать turnleft (все равно он никому не нужен). Еще turnright остался, для чего-нибудь. Но, на этом все.__________________
Мой мод на Xash
Отправлено Ku2zoff 28-02-2021 в 05:48:
Цитата:
Aynekko писал:
Как-то это можно обойти на ксаше?
Не знаю. Надо спросить Дядю Мишу про это ограничение.
Цитата:
Aynekko писал:
потом я еще добавил дэш - но, так как по кнопкам лимит, мне пришлось заюзать turnleft
А как же IN_ALT1? Вроде бы нигде не юзается. Ещё есть IN_CANCEL. Думаю, оба байта свободны. Ну это надо сорцы ксашдвижка глядеть, чтобы точно убедиться.
IN_LEFT, кстати, используется внутри движка, по крайней мере в ксаше, для режима создания overview.
Добавлено 28-02-2021 в 12:48:
Байты кнопок нужны для тех команд, которые нужно шарить между клиентом и сервером, а ещё быстро передавать по сети. Во всех остальных случаях можно обойтись ClientCommand на сервере. Собсно, я поэтому и не стал морочиться с этим в туторе по ползанию.
Отправлено Дядя Миша 28-02-2021 в 06:04:
Цитата:
Ku2zoff писал:
Сейчас попробовал - больше 16 кнопок не добавить.
C++ Source Code:
1 | typedef struct usercmd_s |
12 | unsigned short buttons; // <-- 16 bit |
16 | // Experimental player impact stuff. |
18 | vec3_t impact_position; |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено илья2 28-02-2021 в 09:15:
а вон я нашел в delta DEFINE_DELTA( buttons, DT_SHORT, 16, 1.0 ), это оно
__________________
илья
Отправлено Ku2zoff 28-02-2021 в 11:20:
илья2 не оно. Посмотри структуру usercmd_s. Дядя Миша подписал, что в unsigned short buttons больше 16 бит не влезает. И никак ты это не изменишь без перекомпиляции движка (Импотенциально ещё и сетевой код нужно будет править, т.к. размер структуры вырастет). Так что, свободных бита три: IN_RUN, IN_ALT1, IN_CANCEL. Ровно на три команды. Ну ещё можно IN_SCORE четвёртым взять, он по сути не нужен нигде, кроме как в PlayerDeathThink. И то, только для того, чтобы дохлый игрок не респавнился, когда открывает скоребоард. Остальное либо через ClientCommand, либо командами с клиента (cl_movespeedkey и +speed как пример), там есть доступ к инпуту.