<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.54.205.37&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.54.205.37&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/95.54.205.37"/>
		<updated>2026-06-12T09:18:43Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3.</id>
		<title>Назначение скриптам горячих кнопок. Часть 3.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3."/>
				<updated>2012-11-15T03:22:56Z</updated>
		
		<summary type="html">&lt;p&gt;95.54.205.37: keyboard only&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Зачастую при разработке мода или в игре приходится выполнять различные действия - выдача инфопорций, спавн объектов, включение\отключение скриптового ПНВ, сброс рюкзака, съедание антирада, запуск скриптового меню и т.д. Можно назначать горячие кнопки своим скриптам в любой версии игры, при этом не используя главное меню, кейлоггер или правку движка. Во-первых, это кнопка, нажатие которой отображает на экране название активного квеста (по умолчанию - Tab). Пример можно посмотреть в моде OGSE 0692. В нем на кнопку подвешено съедание антирада и включение пулемета в БТР. Во-вторых, есть алгоритм, использующий другие кнопки. Рассмотрим его подробнее.&lt;br /&gt;
&lt;br /&gt;
Идея довольно проста - использование консольной команды вида &amp;quot;''bind_console demo_record 1 knumpad0''&amp;quot;. В данном примере при нажатии кнопки 0 на дополнительной клавиатуре будет выполнена команда &amp;quot;''demo_record 1''&amp;quot;.&lt;br /&gt;
Таким образом для каждой кнопки можно задать выполнение своей консольной команды. Мы можем взять в качестве команды какую-нибудь неиспользуемую в сингле, например &amp;quot;''mm_net_player_name''&amp;quot;, а в качестве параметра передавать идентификатор нажатой кнопки. Теперь, если на апдейте ловить значение параметра консольной команды, то будем знать, какая кнопка нажата, и выполнять соответствующую ей функцию.&lt;br /&gt;
&lt;br /&gt;
Работает эта схема на любой версии игры. Можно использовать любые кнопки, кроме кнопок мышки. Следует помнить, что при открытом диалоговом окне оно перехватывает обработку клавиш и нажатия не отлавливаются.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вариант 1:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;local con = nil -- переменная для объекта консоли&lt;br /&gt;
local con_command = &amp;quot;mm_net_player_name&amp;quot; -- консольная команда&lt;br /&gt;
local def_value = &amp;quot;_&amp;quot; -- значение по умолчанию - символ подчеркивания&lt;br /&gt;
&lt;br /&gt;
function update()&lt;br /&gt;
	if not con then -- инициализируем схему&lt;br /&gt;
		con = get_console() -- кешируем консоль&lt;br /&gt;
		con:execute( con_command ..&amp;quot; &amp;quot;.. def_value ) -- инициализируем дефотлным значением, т.к. кнопка не нажата&lt;br /&gt;
		for k,v in pairs(_G[script_name()]) do -- перебираем функции в текущем файле&lt;br /&gt;
			 -- v это функция 	и её имя является кодом клавиши&lt;br /&gt;
			if type(v)=='function' and DIK_keys[string.upper(k)] then&lt;br /&gt;
				local key = &amp;quot;k&amp;quot;..string.gsub(k,&amp;quot;dik_&amp;quot;,&amp;quot;&amp;quot;) -- формируем ключ и&lt;br /&gt;
				con:execute(&amp;quot;bind_console &amp;quot;..con_command..&amp;quot; &amp;quot;..k..&amp;quot; &amp;quot;..key) -- биндим кнопку на него&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- получаем из консоли значение параметра для нашей команды&lt;br /&gt;
		local str = con:get_string(con_command) &lt;br /&gt;
		-- если оно не является значением по умолчанию&lt;br /&gt;
		-- и в этом файле есть функция с таким именем, то выполняем её&lt;br /&gt;
		if str~=def_value and this[str] then&lt;br /&gt;
			this[str]()&lt;br /&gt;
			con:execute(con_command..&amp;quot; &amp;quot;..def_value) -- записываем значение по умолчанию&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dik_numpad0()&lt;br /&gt;
  news_manager.send_tip(db.actor,&amp;quot;нажали кнопку numpad0&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dik_numpad1()&lt;br /&gt;
  news_manager.send_tip(db.actor,&amp;quot;нажали кнопку numpad1&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dik_numpad2()&lt;br /&gt;
  news_manager.send_tip(db.actor,&amp;quot;нажали кнопку numpad2&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
При нажатии клавиш 0,1 или 2 цифровой клавиатуры будет выведено соответствующее каждой кнопке сообщение.&lt;br /&gt;
Отслеживать можно не только нажатие, но и отпускание кнопки. Cделать это можно аналогично случаю с кнопкой Tab.&lt;br /&gt;
На наше счастье на одно действие можно забиндить вторую кнопку командой &amp;quot;bind_sec&amp;quot;. Вариант кода с отлавливанием отпускания выглядит так:&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вариант 2:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;local con = nil&lt;br /&gt;
local con_command = &amp;quot;mm_net_player_name&amp;quot;&lt;br /&gt;
local def_value = &amp;quot;_&amp;quot;&lt;br /&gt;
local act_key = &amp;quot;&amp;quot; -- последняя нажатая клавиша&lt;br /&gt;
&lt;br /&gt;
function update()&lt;br /&gt;
	if not con then&lt;br /&gt;
		con = get_console()&lt;br /&gt;
		con:execute(con_command ..&amp;quot; &amp;quot; .. def_value)&lt;br /&gt;
		for k,v in pairs(_G[script_name()]) do&lt;br /&gt;
			if type(v)=='function' and DIK_keys[string.upper(k)] then&lt;br /&gt;
				local key = &amp;quot;k&amp;quot;..string.gsub(k,&amp;quot;dik_&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
				con:execute(&amp;quot;bind_console &amp;quot;..con_command..&amp;quot; &amp;quot;..k..&amp;quot; &amp;quot;..key)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local str = con:get_string(con_command)&lt;br /&gt;
		if str~=def_value and this[str] then&lt;br /&gt;
			this[str]()&lt;br /&gt;
			con:execute(con_command ..&amp;quot; &amp;quot; .. def_value)&lt;br /&gt;
&lt;br /&gt;
			--отлова отпускания&lt;br /&gt;
			-- биндим на показ статика активного квеста нажатую кнопку&lt;br /&gt;
			con:execute(&amp;quot;bind_sec scores k&amp;quot;..string.gsub(str,&amp;quot;dik_&amp;quot;,&amp;quot;&amp;quot;))&lt;br /&gt;
			-- если статик ещё не показан, то показываем его&lt;br /&gt;
			-- он будет висеть пока не отпущена клавиша&lt;br /&gt;
			local cs = get_hud():GetCustomStatic(&amp;quot;main_task&amp;quot;) or get_hud():AddCustomStatic(&amp;quot;main_task&amp;quot;)&lt;br /&gt;
			-- задаем 100% прозрачность тексту, чтоб не светился без нужды&lt;br /&gt;
			cs:wnd():SetTextColor(0,240,217,182)&lt;br /&gt;
			act_key = str -- запоминаем нажатую кнопку&lt;br /&gt;
			news_manager.send_tip(db.actor,&amp;quot;нажали &amp;quot;..act_key)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- отлов отпускания&lt;br /&gt;
	local cs = get_hud():GetCustomStatic(&amp;quot;main_task&amp;quot;)&lt;br /&gt;
	if act_key~=&amp;quot;&amp;quot; and not cs then -- была нажата клавиша, а статика нет&lt;br /&gt;
		con:execute(&amp;quot;unbind_sec scores&amp;quot;)&lt;br /&gt;
		news_manager.send_tip(db.actor,&amp;quot;отпустили &amp;quot;..act_key)&lt;br /&gt;
		act_key=&amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dik_numpad0()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dik_numpad1()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dik_numpad2()&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
При нажатии клавиши 0 на дополнительной клавиатуре будет выведено сообщение &amp;quot;нажали 0&amp;quot;, а при отпускании &amp;quot;отпустили 0&amp;quot;.Функцию update вызываем из апдейта биндера актора. Имена функций берутся из класса-перечисления DIK_keys, описание которого можно найти в lua_help.script.&lt;br /&gt;
&lt;br /&gt;
Автор '''Charsi'''. Навел на идею '''Shadows'''.&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.54.205.37</name></author>	</entry>

	</feed>