<?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.218.228&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.218.228&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.218.228"/>
		<updated>2026-06-12T09:18:40Z</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-12T19:49:32Z</updated>
		
		<summary type="html">&lt;p&gt;95.54.218.228: minifix&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.218.228</name></author>	</entry>

	</feed>