Назначение скриптам горячих кнопок. Часть 3. — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(Новая страница: «Зачастую при разработке мода или в игре приходится выполнять различные действия - выдача ...») |
|||
(не показаны 3 промежуточных версий 3 участников) | |||
Строка 4: | Строка 4: | ||
Таким образом для каждой кнопки можно задать выполнение своей консольной команды. Мы можем взять в качестве команды какую-нибудь неиспользуемую в сингле, например "''mm_net_player_name''", а в качестве параметра передавать идентификатор нажатой кнопки. Теперь, если на апдейте ловить значение параметра консольной команды, то будем знать, какая кнопка нажата, и выполнять соответствующую ей функцию. | Таким образом для каждой кнопки можно задать выполнение своей консольной команды. Мы можем взять в качестве команды какую-нибудь неиспользуемую в сингле, например "''mm_net_player_name''", а в качестве параметра передавать идентификатор нажатой кнопки. Теперь, если на апдейте ловить значение параметра консольной команды, то будем знать, какая кнопка нажата, и выполнять соответствующую ей функцию. | ||
− | Работает эта схема на любой версии игры | + | Работает эта схема на любой версии игры. Не следует использовать уже забинденные клавиши, т.к. действия, ассоциированные с ними, возможно перестанут выполняться. Следует помнить, что при открытом диалоговом окне оно перехватывает обработку клавиш и нажатия не отлавливаются. |
{| class="collapsible collapsed" | {| class="collapsible collapsed" | ||
Строка 18: | Строка 18: | ||
if not con then -- инициализируем схему | if not con then -- инициализируем схему | ||
con = get_console() -- кешируем консоль | con = get_console() -- кешируем консоль | ||
− | con:execute( con_command .. def_value ) -- инициализируем дефотлным значением, т.к. кнопка не нажата | + | con:execute( con_command .." ".. def_value ) -- инициализируем дефотлным значением, т.к. кнопка не нажата |
for k,v in pairs(_G[script_name()]) do -- перебираем функции в текущем файле | for k,v in pairs(_G[script_name()]) do -- перебираем функции в текущем файле | ||
-- v это функция и её имя является кодом клавиши | -- v это функция и её имя является кодом клавиши | ||
Строка 33: | Строка 33: | ||
if str~=def_value and this[str] then | if str~=def_value and this[str] then | ||
this[str]() | this[str]() | ||
− | con:execute(con_command..def_value) -- записываем значение по умолчанию | + | con:execute(con_command.." "..def_value) -- записываем значение по умолчанию |
end | end | ||
end | end | ||
Строка 68: | Строка 68: | ||
if not con then | if not con then | ||
con = get_console() | con = get_console() | ||
− | con:execute(con_command .. def_value) | + | con:execute(con_command .." " .. def_value) |
for k,v in pairs(_G[script_name()]) do | for k,v in pairs(_G[script_name()]) do | ||
if type(v)=='function' and DIK_keys[string.upper(k)] then | if type(v)=='function' and DIK_keys[string.upper(k)] then | ||
Строка 79: | Строка 79: | ||
if str~=def_value and this[str] then | if str~=def_value and this[str] then | ||
this[str]() | this[str]() | ||
− | con:execute(con_command .. def_value) | + | con:execute(con_command .." " .. def_value) |
--отлова отпускания | --отлова отпускания | ||
Строка 116: | Строка 116: | ||
Автор '''Charsi'''. Навел на идею '''Shadows'''. | Автор '''Charsi'''. Навел на идею '''Shadows'''. | ||
+ | [[Категория:Скрипты]] |
Текущая версия на 20:12, 15 ноября 2012
Зачастую при разработке мода или в игре приходится выполнять различные действия - выдача инфопорций, спавн объектов, включение\отключение скриптового ПНВ, сброс рюкзака, съедание антирада, запуск скриптового меню и т.д. Можно назначать горячие кнопки своим скриптам в любой версии игры, при этом не используя главное меню, кейлоггер или правку движка. Во-первых, это кнопка, нажатие которой отображает на экране название активного квеста (по умолчанию - Tab). Пример можно посмотреть в моде OGSE 0692. В нем на кнопку подвешено съедание антирада и включение пулемета в БТР. Во-вторых, есть алгоритм, использующий другие кнопки. Рассмотрим его подробнее.
Идея довольно проста - использование консольной команды вида "bind_console demo_record 1 knumpad0". В данном примере при нажатии кнопки 0 на дополнительной клавиатуре будет выполнена команда "demo_record 1". Таким образом для каждой кнопки можно задать выполнение своей консольной команды. Мы можем взять в качестве команды какую-нибудь неиспользуемую в сингле, например "mm_net_player_name", а в качестве параметра передавать идентификатор нажатой кнопки. Теперь, если на апдейте ловить значение параметра консольной команды, то будем знать, какая кнопка нажата, и выполнять соответствующую ей функцию.
Работает эта схема на любой версии игры. Не следует использовать уже забинденные клавиши, т.к. действия, ассоциированные с ними, возможно перестанут выполняться. Следует помнить, что при открытом диалоговом окне оно перехватывает обработку клавиш и нажатия не отлавливаются.
Вариант 1: |
---|
local con = nil -- переменная для объекта консоли |
При нажатии клавиш 0,1 или 2 цифровой клавиатуры будет выведено соответствующее каждой кнопке сообщение. Отслеживать можно не только нажатие, но и отпускание кнопки. Cделать это можно аналогично случаю с кнопкой Tab. На наше счастье на одно действие можно забиндить вторую кнопку командой "bind_sec". Вариант кода с отлавливанием отпускания выглядит так:
Вариант 2: |
---|
local con = nil |
При нажатии клавиши 0 на дополнительной клавиатуре будет выведено сообщение "нажали 0", а при отпускании "отпустили 0".Функцию update вызываем из апдейта биндера актора. Имена функций берутся из класса-перечисления DIK_keys, описание которого можно найти в lua_help.script.
Автор Charsi. Навел на идею Shadows.