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

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

Статьи или фрагменты кода для новичков и уже опытных скриптеров по 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: Кнопочные константы или как избавиться от лишних биндов.

Сообщение Mistrick » 23 фев 2014, 23:28

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

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

Сообщение DumoH4uk » 06 май 2014, 18:25

Потыкал по всем клавишам так и не понял какие кнопки отлавливает

IN_RUN и IN_ALT1
Аватара пользователя
DumoH4uk
 
Сообщения: 104
Зарегистрирован: 20 окт 2010, 22:49
Откуда: Москва
Благодарил (а): 41 раз.
Поблагодарили: 7 раз.

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

Сообщение артист666 » 08 май 2014, 22:27

Не работают они...

IN_RUN - идти
IN_ALT1 - стрейф
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

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

Сообщение Leonidddd » 13 май 2014, 21:42

IN_RUN - идти
IN_ALT1 - стрейф

Действительно,не ловится.Кто-то знает из-за чего может это происходить?В исходниках amxx и cssdk нужно ещё бы посмотреть...
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

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

Сообщение Leonidddd » 15 май 2014, 00:56

input.cpp :
[pawn]
  1.         if (in_alt1.state & 3)

  2.         {

  3.                 bits |= IN_ALT1;

  4.         }
[/pawn]

Ловится в cssdk.А вот IN_RUN - нет(его по всей вероятности пропустили,либо я где-то не там смотрю).
В singleplayer(клиентская часть) нашёл только:
[pawn]
  1. #define K_SHIFT                 134
[/pawn]
Так что IN_RUN - чисто клиентская команда.Может кто лучше объяснит,буду рад.
Прикрепляю пару вложений:

P.S.[spoiler]Ах извиняюсь,но я не могу удалить/редактировать предыдущее сообщение,пришлось даблпостить.[/spoiler]
P.P.S.
[spoiler]Надеюсь,намек ясен :-[[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

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

Сообщение pakistana31 » 22 май 2014, 22:03

Код: Выделить всё
Возможно ли таким образом отловить INS DEL?
Аватара пользователя
pakistana31
 
Сообщения: 83
Зарегистрирован: 30 мар 2014, 12:20
Забанен
Благодарил (а): 32 раз.
Поблагодарили: 8 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

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

Сообщение Leonidddd » 22 май 2014, 22:14

pakistana31, нет.Можно отловить,но создатели амхмодх не реализовали там один форвард для хука подобных команд...
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Пред.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4