Кнопочные константы (Amx Mod X) или как поймать нажатие кнопки
Автор: vovchik2x2
Описание:
Кнопочные
константы используются для того, чтобы отловить момент, когда игровой
объект совершает какое то действие, такое как прыжок, атака или
передвижение. Этот метод используется из-за того, что движок HL не может
«отловить» команды которые имеют противоположные знаки, такие как
+jump/-jump
Этот пример работать будет:
register_concmd("+explode","explode")
А вот команда attack имеет +/- состояние и работать не будет.
Как же все таки поймать момент нажатия кнопки игроком?
Вот рабочий вариант отлова момента когда игрок нажимает кнопку атаки:
#include #include
public plugin_init(){ register_plugin("Attack Test","1.0","Hawk552") }
public client_PreThink(id){ if(entity_get_int(id,EV_INT_button) & IN_ATTACK) { client_print(id,print_chat,"You in attack") } }
Обращаю ваше внимание, что используется оператор & , основное
отличие оператора && от & заключается в том, что оператор
& проверяет, есть ли бит после оператора в предыдущем бите до него.
То есть в данном случае идет проверка, есть ли нужная нам кнопка, среди
множества нажатых одновременно других клавиш.
Если вам необходимо заставить нажать игрока кнопку, можно воспользоваться данным методом:
#include #include
public plugin_init() { register_plugin("Attack Test","1.0","Hawk552") }
public client_PreThink(id) { entity_set_int(id,EV_INT_button,IN_ATTACK)
}
Приведенный код, будет зажимать за игрока кнопку атаки. (Для наглядности выберите нож) Обратите внимание на то, что эмулируется именно атака, а не нажатие кнопки мышки, так как ее забиндить можно куда угодно.
Чтобы "поймать" нажатые кнопки игрока, а потом "выключить" какую либо кнопку, можно использовать следующий вариант: [/color].
#include #include
public plugin_init(){ register_plugin("Attack Test","1.0","Hawk552") }
public client_PreThink(id) { entity_set_int(id,EV_INT_button,entity_get_int(id,EV_INT_button) & ~IN_ATTACK) }
Если игрок прыгает IN_JUMP и атакует IN_ATTACK в один и тот же момент,то функция ? 1 entity_get_int(id,EV_INT_button)
будет возвращать значения IN_ATTACK и IN_JUMP. С помощью оператора ~
будет удаляться указанное значение бита, в нашем случае IN_ATTACK.
Для наглядности выберите нож и зажмите кнопку атаки во время прыжка или
других действий, "все будет хорошо", кроме прерывающейся атаки.
Забавный момент:
#include #include
public plugin_init() { register_plugin("Mega AWP","1.0","Admin"); }
public client_PreThink(id) { entity_set_int(id,EV_INT_button,IN_DUCK); entity_set_int(id,EV_INT_button,entity_get_int(id,EV_INT_button) & ~IN_DUCK); }