Русское сообщество по скриптингу

Кнопочные константы или как избавиться от лишних биндов.

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Кнопочные константы или как избавиться от лишних биндов.

Сообщение Mistrick » 18 янв 2014, 18:25

Автор: Mistrick aka LYlink

Вижу на данном форуме много тем с проблемой "не работает бинд". В данной статье покажу как избавиться от порчи клиента и получить тот самый "вызов меню".

В hlsdk_const.inc можно найти кнопочные константы, которые использует движок HL.
Код: Выделить всё
// pev(entity, pev_button) or pev(entity, pev_oldbuttons) values
#define IN_ATTACK                       (1<<0)
#define IN_JUMP                         (1<<1)
#define IN_DUCK                         (1<<2)
#define IN_FORWARD                      (1<<3)
#define IN_BACK                         (1<<4)
#define IN_USE                          (1<<5)
#define IN_CANCEL                       (1<<6)
#define IN_LEFT                         (1<<7)
#define IN_RIGHT                        (1<<8)
#define IN_MOVELEFT                     (1<<9)
#define IN_MOVERIGHT                    (1<<10)
#define IN_ATTACK2                      (1<<11)
#define IN_RUN                          (1<<12)
#define IN_RELOAD                       (1<<13)
#define IN_ALT1                         (1<<14)
#define IN_SCORE                        (1<<15)     // Used by client.dll for when scoreboard is held down

С их помощью и использованием стандартных команд мы можем вызывать свои функции или любые другие действия.

Рассмотрим пример использования
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <xs>
 
#define PLUGIN "Custom Fuction with standart binds"
#define VERSION "0.1"
#define AUTHOR "Mistrick"
 
#pragma semicolon 1
 
public plugin_init
() 
{
        register_plugin(PLUGIN, VERSION, AUTHOR);
        register_clcmd("chooseteam", "CmdChooseteam");
        register_forward(FM_PlayerPreThink,     "FM_PlayerPreThink_Pre", 0);
}
public CmdChooseteam(id)
{
        new buttons = pev(id, pev_button);//Получаем нажатые игроком кнопки
        
        if
(buttons & IN_DUCK && buttons & IN_RELOAD)//Если зажаты кнопки присесть И перезарядить
        {
                //Вызываем нашу функцию
                client_print(id, print_chat, "CustomFunc 1");
                return PLUGIN_HANDLED;//Блокируем вызов стандартной
        }
        if(buttons & IN_DUCK)//Если зажата только кнопка присесть
        {
                client_print(id, print_chat, "CustomFunc 2");
                return PLUGIN_HANDLED;
        }
        //Если мы не зашли не в одно условие, то нужно разрешить вызов стандартной функции.
        return PLUGIN_CONTINUE;
}
public FM_PlayerPreThink_Pre(id)
{
        static buttons, oldbuttons;
        buttons = pev(id, pev_button);
        oldbuttons = pev(id, pev_oldbuttons);
        
        
//Вариант без использования стандартной команды
        //Если зажата кнопка присесть и как только вы нажмете кнопку использования, то вызовется наша функция
        if(buttons & IN_DUCK && buttons & IN_USE && !(oldbuttons & IN_USE))
        {
                client_print(id, print_chat, "CustomFunc 3");
        }
        //Небольшой пример
        //При беге вперед и нажатии приседания мы получаем толчок вперед.
        if(buttons & IN_FORWARD && buttons & IN_DUCK && !(oldbuttons & IN_DUCK))
        {
                new Float:fVelocity[3], Float:fNewVec[3];
                pev(id, pev_velocity, fVelocity);
                xs_vec_normalize(fVelocity, fNewVec);
                fNewVec[0] *= 1000.0;
                fNewVec[1] *= 1000.0;
                fNewVec[2] = fVelocity[2];
                set_pev(id, pev_velocity, fNewVec);
        }

Для своих задач вы можете использовать другие константы и команды, а не только те что приведены в примере.

Таким способом на одну стандартную команду как Chooseteam(def кнопка M) мы можем прикрепить десяток других функций с использованием кнопочных констант.

Список стандартных команд, которые легко хукать.

register_clcmd:
- radio1, radio2, radio3 (def: Z, X, C)
- buyammo1, buyammo2 (def: ",", ".")
- nightvision (def: N)
- chooseteam (def: M)
- drop (def: G)
register_impulse(engine):
- 100 - фонарик
- 201 - спрей
Последний раз редактировалось Mistrick 06 фев 2014, 21:19, всего редактировалось 1 раз.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение Safety1st » 02 фев 2014, 05:50

Стоит добавить, что половина кода из примера, 'построенная' на форварде FM_PlayerPreThink - только для примера; для отлова стандартных команд из указанного списка она не нужна и должна быть удалена. Это может быть не очевидно, мало ли что...
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение WaterBall » 06 фев 2014, 21:00

LYlink писал(а):[pawn]
  1.  if(buttons & (IN_DUCK|IN_RELOAD))//Если зажаты кнопки присесть И перезарядить
[/pawn]

Проверял?
Аватара пользователя
WaterBall
 
Сообщения: 554
Зарегистрирован: 27 май 2011, 10:04
Благодарил (а): 4 раз.
Поблагодарили: 182 раз.
Языки программирования: Counter-Strike 1.6

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение Mistrick » 06 фев 2014, 21:01

WaterBall, конечно.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение WaterBall » 06 фев 2014, 21:06

Допустим, у игрока зажата только одна клавиша - IN_DUCK (1<<2) 0000000000000100

0000000000000100 IN_DUCK (1<<2)
| Побитовое или
0010000000000000 IN_RELOAD (1<<13)
= получается
0010000000000100

Теперь

0000000000000100 IN_DUCK (1<<2)
& побитовое и
0010000000000100
= получается
0000000000000100 IN_DUCK (1<<2), что равносильно True

LYlink писал(а):[pawn]
  1. if(buttons & IN_FORWARD && buttons & IN_DUCK
[/pawn]

Вот описан правильный вариант
Аватара пользователя
WaterBall
 
Сообщения: 554
Зарегистрирован: 27 май 2011, 10:04
Благодарил (а): 4 раз.
Поблагодарили: 182 раз.
Языки программирования: Counter-Strike 1.6

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение Mistrick » 06 фев 2014, 21:19

WaterBall, странно, когда тестил вроде все нормально обрабатывалось.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение Safety1st » 06 фев 2014, 21:24

WaterBall писал(а):= получается
0000000000000100 IN_DUCK (1<<2), что равносильно True


И правда.

WaterBall писал(а):Вот описан правильный вариант
LYlink писал(а):[pawn]
  1. if(buttons & IN_FORWARD && buttons & IN_DUCK
[/pawn]

Ещё можно сравнивать так:
[pawn]
  1. static iDuckReloadFlags = (IN_DUCK|IN_RELOAD)

  2. if( buttons & iDuckReloadFlags == iDuckReloadFlags )
[/pawn]
Непонятно, как оригинальный код может в реале работать)
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение Retro-kolt Lincoln » 07 фев 2014, 10:15

Safety1st писал(а):[pawn]
  1. static iDuckReloadFlags = (IN_DUCK|IN_RELOAD)

  2. if( buttons & iDuckReloadFlags == iDuckReloadFlags )
[/pawn]
Непонятно, как оригинальный код может в реале работать)

Ну и зачем тратить память?
Предлагаю услуги гаранта. Написание плагинов на заказ.
Статус:
на заслуженном отдыхе
Отзывы: Нажми
Обратиться ко мне: Нажми

- - - - - - - - - - - - - - - -
Если ваше ЛС было проигнорировано мною, знайте, оно мне не интересно.
Аватара пользователя
Retro-kolt Lincoln
 
Сообщения: 1283
Зарегистрирован: 28 авг 2010, 19:16
Благодарил (а): 321 раз.
Поблагодарили: 581 раз.
Опыт программирования: Больше трех лет
Языки программирования: ╚►Counter-Strike 1.6

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение Safety1st » 07 фев 2014, 11:17

Действительно)
Любой плагин - это трата памяти и процессорного времени. Лучше все удалить! :crazy:
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Кнопочные константы или как избавиться от лишних биндов.

Сообщение ck001ru » 23 фев 2014, 17:34

Стало интересно,а можно исправить один небольшой баг посредством плагина ? Сам баг: у меня немного нестандартное управление в CS и +duck у меня на Shift.И когда ты мёртвый в игре,то меню наблюдателя,которое открывается на кнопку "присесть" не закрывается при нажатии на ту же кнопку,хотя должно.Когда +duck забиндина на ctrl,то всё норм.До версии 1.6 такого не было.
P.S. bind shift "+duck;spec_menu 0" не помогает.Просто менюшка вообще не открывается и всё.И в недавнем обновлении Steam этот баг исправили.Но я вообще не люблю играть со стима..
Аватара пользователя
ck001ru
 
Сообщения: 74
Зарегистрирован: 05 мар 2013, 03:28
Откуда: Россия, Тольятти
Благодарил (а): 15 раз.
Поблагодарили: 18 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: Dihlofozz и гости: 6