Ru Button constants (AMX Mod X)

From AlliedModders Wiki
Revision as of 15:03, 8 December 2006 by VEN (talk | contribs) (had to implement a workaround - annoying bug(?))
Jump to: navigation, search

Кнопочные константы

Просмотреть оригинал статьи (англ.)

Использование

Кнопочные константы обычно используются для того, чтобы "поймать" момент, когда entity совершает какое либо действие, такое как прыжок, передвижение или атака. Метод используется из-за того, что жвижок ХЛ не может "поймать" +/- команды, если их реализация выполнена в самом движке.

Например, Это будет работать:

register_concmd("+explode","explode");

А это - нет:

register_concmd("+attack","hook_attack");

Константы

Полный список всех констант вы можете найти здесь.

Реализация

Вот, например, один из вариантов, как "поймать" момент, когда игрок атакует:

#include <amxmodx>
#include <engine>
 
public plugin_init()
{
	register_plugin("Attack Test","1.0","Hawk552");
}
 
public client_PreThink(id)
{
	if(entity_get_int(id, EV_INT_BUTTON) & IN_ATTACK)
	{
		// do something
	}
}

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

Чтобы заставить энтити эмулировать нажатие кнопки, можно поступить следующим образом:

#include <amxmodx>
#include <engine>
 
public plugin_init()
{
	register_plugin("Attack Test","1.0","Hawk552");
}
 
public client_PreThink(id)
{
	entity_set_int(id,EV_INT_button,IN_ATTACK);
}

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

Чтобы "поймать" кнопки энтити, а потом "вычесть" какую либо кнопку, можно использовать следующий метод:

#include <amxmodx>
#include <engine>
 
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) одновременно. В этом случае, функция entity_get_int(id,EV_INT_button) будет возвращать значения IN_ATTACK и IN_JUMP. Используя оператор ~ будет удаляться конкретное значение бита, в данном случае IN_ATTACK. Таким образом, функция (из примера) будет возвращать только IN_JUMP.

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