HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > как создать третью атаку ?
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
илья2
Житель форума

Группа: Неопытный
Дата регистрации: Mar 2020
Проживает: деревня пидарасов
Сообщений: 128
Возраст: 36

Рейтинг



как создать третью атаку ?

как создать третью атаку например 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) ) )

На этом все спасибо за внимание всего наилучшего

__________________
Илья

Сообщить модератору | | IP: Записан
Сообщение: 200412

Старое сообщение 27-02-2021 21:59
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 5986
Возраст: 30

Рейтинг



Цитата:
илья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 не трогал, мб. там надо увеличить число.

Сообщить модератору | | IP: Записан
Сообщение: 200419

Старое сообщение 28-02-2021 05:08
- За что?
Aynekko
Маппер

Дата регистрации: Jun 2016
Проживает: г. Подольск, Россия
Сообщений: 589
Возраст: 28

Рейтинг



Цитата:
Ku2zoff писал:

Сейчас попробовал - больше 16 кнопок не добавить

Как-то это можно обойти на ксаше? У меня уже добавлен бег (тебе спасибо), потом я еще добавил дэш - но, так как по кнопкам лимит, мне пришлось заюзать turnleft (все равно он никому не нужен). Еще turnright остался, для чего-нибудь. Но, на этом все.

__________________
Мой мод на Xash

Сообщить модератору | | IP: Записан
Сообщение: 200420

Старое сообщение 28-02-2021 05:19
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 5986
Возраст: 30

Рейтинг



Цитата:
Aynekko писал:
Как-то это можно обойти на ксаше?

Не знаю. Надо спросить Дядю Мишу про это ограничение.
Цитата:
Aynekko писал:
потом я еще добавил дэш - но, так как по кнопкам лимит, мне пришлось заюзать turnleft

А как же IN_ALT1? Вроде бы нигде не юзается. Ещё есть IN_CANCEL. Думаю, оба байта свободны. Ну это надо сорцы ксашдвижка глядеть, чтобы точно убедиться.
IN_LEFT, кстати, используется внутри движка, по крайней мере в ксаше, для режима создания overview.

Добавлено 28-02-2021 в 12:48:

Байты кнопок нужны для тех команд, которые нужно шарить между клиентом и сервером, а ещё быстро передавать по сети. Во всех остальных случаях можно обойтись ClientCommand на сервере. Собсно, я поэтому и не стал морочиться с этим в туторе по ползанию.

Отредактировано Ku2zoff 28-02-2021 в 05:42

Сообщить модератору | | IP: Записан
Сообщение: 200422

Старое сообщение 28-02-2021 05:48
- За что?
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 28294
Нанёс повреждений: 386 ед.

Рейтинг



Цитата:
Ku2zoff писал:
Сейчас попробовал - больше 16 кнопок не добавить.

C++ Source Code:
1
typedef struct usercmd_s
2
{
3
  short		lerp_msec;
4
  byte		msec;
5
  vec3_t		viewangles;
6
 
7
  // intended velocities
8
  float		forwardmove;
9
  float		sidemove;
10
  float		upmove;
11
  byte		lightlevel;
12
  unsigned short	buttons;		// <-- 16 bit
13
  byte		impulse;
14
  byte		weaponselect;
15
 
16
  // Experimental player impact stuff.
17
  int		impact_index;
18
  vec3_t		impact_position;
19
} usercmd_t;

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Сообщить модератору | | IP: Записан
Сообщение: 200423

Старое сообщение 28-02-2021 06:04
-
илья2
Житель форума

Группа: Неопытный
Дата регистрации: Mar 2020
Проживает: деревня пидарасов
Сообщений: 128
Возраст: 36

Рейтинг



а вон я нашел в delta DEFINE_DELTA( buttons, DT_SHORT, 16, 1.0 ), это оно

__________________
Илья

Сообщить модератору | | IP: Записан
Сообщение: 200424

Старое сообщение 28-02-2021 09:15
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 5986
Возраст: 30

Рейтинг



илья2 не оно. Посмотри структуру usercmd_s. Дядя Миша подписал, что в unsigned short buttons больше 16 бит не влезает. И никак ты это не изменишь без перекомпиляции движка (Импотенциально ещё и сетевой код нужно будет править, т.к. размер структуры вырастет). Так что, свободных бита три: IN_RUN, IN_ALT1, IN_CANCEL. Ровно на три команды. Ну ещё можно IN_SCORE четвёртым взять, он по сути не нужен нигде, кроме как в PlayerDeathThink. И то, только для того, чтобы дохлый игрок не респавнился, когда открывает скоребоард. Остальное либо через ClientCommand, либо командами с клиента (cl_movespeedkey и +speed как пример), там есть доступ к инпуту.

Отредактировано Ku2zoff 28-02-2021 в 11:27

Сообщить модератору | | IP: Записан
Сообщение: 200425

Старое сообщение 28-02-2021 11:20
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 13:26. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > как создать третью атаку ?
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2021