Вижу на данном форуме много тем с проблемой "не работает бинд". В данной статье покажу как избавиться от порчи клиента и получить тот самый "вызов меню".
В 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 - спрей