Назначение скриптам горячих кнопок. Часть 1. Скрипт — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
HikeR (обсуждение | вклад) (начало) |
HikeR (обсуждение | вклад) (продолжение) |
||
| Строка 1: | Строка 1: | ||
| − | Поизучав мод от камрада Jeppa решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш | + | == Вступление == |
| − | (если кто знает ссылку на первоисточник мода '''jeppa_s_mod__v1.05__incl.vehicles_946''', то поставьте ее плиз. я только ссылки на закачку находил) | + | |
| + | Поизучав мод от камрада Jeppa решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре. | ||
| + | ''(если кто знает ссылку на первоисточник мода '''jeppa_s_mod__v1.05__incl.vehicles_946''', то поставьте ее плиз. я только ссылки на закачку находил)'' | ||
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция. | К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция. | ||
| + | |||
| + | Нам понадобятся следующие распакованные (или имеющиеся) файлы: | ||
| + | config\system.ltx | ||
| + | scripts\ui_main_menu.script | ||
| + | Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы. | ||
| + | |||
| + | == Скрипт == | ||
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам. Вот его содержание: | Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам. Вот его содержание: | ||
| Строка 25: | Строка 34: | ||
-- сразу созадим ф-ию для выхода | -- сразу созадим ф-ию для выхода | ||
| − | function cheat: | + | function cheat:on_quit() |
| − | + | local console = get_console() | |
| − | self:GetHolder():start_stop_menu(self.owner, true) | + | self:GetHolder():start_stop_menu (self.owner, true) |
| − | self:GetHolder():start_stop_menu(self, true) | + | self:GetHolder():start_stop_menu (self,true) |
| − | self.owner:Show ( | + | self.owner:Show (true) |
| + | -- если мы вызывались из игры, то убираем главное меню | ||
| + | if level.present() and (db.actor ~= nil) and db.actor:alive() then | ||
| + | console:execute("main_menu off") | ||
| + | end | ||
end | end | ||
| − | |||
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию: | Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию: | ||
function main_menu:OnKeyboard(dik, keyboard_action) | function main_menu:OnKeyboard(dik, keyboard_action) | ||
| Строка 68: | Строка 80: | ||
function cheat:OnKeyboard(dik, keyboard_action) | function cheat:OnKeyboard(dik, keyboard_action) | ||
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) | CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) | ||
| − | |||
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then | if keyboard_action == ui_events.WINDOW_KEY_PRESSED then | ||
| + | -- сразу же производим действия для возврата | ||
| + | self:on_quit() | ||
-- на выход повесим Esc | -- на выход повесим Esc | ||
if dik == DIK_keys.DIK_ESCAPE then | if dik == DIK_keys.DIK_ESCAPE then | ||
| − | -- | + | -- тут ничего не делаем |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
end | end | ||
| Строка 85: | Строка 92: | ||
Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем '''F1''', анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем '''Esc''' и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :) | Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем '''F1''', анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем '''Esc''' и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :) | ||
| − | Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. | + | == Предметы == |
| + | |||
| + | Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''): | ||
| + | -- spawn_item - необходимый предмет | ||
| + | -- dist - радиус появления (случайно) | ||
| + | -- disp - некий разброс, чтобы не было спавна прямо в игрока | ||
| + | function cheat:spawn_item(spawn_item, dist, disp) | ||
| + | local position = vector():set(0,0,0) | ||
| + | position.x = db.actor:position().x + math.random(-dist,dist) + disp | ||
| + | position.z = db.actor:position().z + math.random(-dist,dist) + disp | ||
| + | position.y = db.actor:position().y + disp | ||
| + | alife():create(spawn_item, position, 1, db.actor:game_vertex_id()) | ||
| + | end | ||
| + | Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки: | ||
| + | if dik == DIK_keys.DIK_ESCAPE then | ||
| + | добавим следующее: | ||
| + | elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1() | ||
| + | elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2() | ||
| + | и создадим эти функции (опять добавляем в конец файла): | ||
| + | function cheat:cheat1() | ||
| + | -- колдуем грозу в радиусе 2 метров плюс 1 метр | ||
| + | self:spawn_item("wpn_groza", 2, 1) | ||
| + | end | ||
| + | function cheat:cheat2() | ||
| + | self:spawn_item("ammo_9x39_sp5", 2, 1) | ||
| + | end | ||
| + | |||
| + | == Траспорт == | ||
| + | |||
| + | Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы. | ||
| + | |||
| + | Создадим новый файл с именем cars_spawn.ltx | ||
| + | [ven_niva] | ||
| + | class = SCRPTCAR | ||
| + | cform = skeleton | ||
| + | visual = physics\vehicles\niva\veh_niva_u_01.ogf | ||
| + | Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг: | ||
| + | #include "models\vehicles\cars_spawn.ltx" | ||
| + | Далее по накатанной дорожке. Допишем функцию вызова спавна: | ||
| + | function cheat:cheat3() | ||
| + | self:spawn_item("ven_niva", 5, 1) | ||
| + | end | ||
| + | и назначим ей кнопку 3 на цифровой клавиатуре: | ||
| + | elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3() | ||
| + | Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы. | ||
| + | |||
| + | Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности. | ||
Продолжение следует... | Продолжение следует... | ||
| − | --[[Участник:HikeR|HikeR]] | + | --[[Участник:HikeR|HikeR]] 06:34, 20 мая 2007 (MSD) |
[[Категория:Незаконченные_статьи]] | [[Категория:Незаконченные_статьи]] | ||
Версия 02:34, 20 мая 2007
Содержание
Вступление
Поизучав мод от камрада Jeppa решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре. (если кто знает ссылку на первоисточник мода jeppa_s_mod__v1.05__incl.vehicles_946, то поставьте ее плиз. я только ссылки на закачку находил)
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.
Нам понадобятся следующие распакованные (или имеющиеся) файлы:
config\system.ltx scripts\ui_main_menu.script
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.
Скрипт
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его ui_cheat.script и положим ко всем остальным скриптам. Вот его содержание:
-- инициализация
class "cheat" (CUIScriptWnd)
function cheat:__init(owner) super()
self.owner = owner
self:InitControls()
self:InitCallBacks()
end
function cheat:__finalize() end
function cheat:InitControls()
-- здесь будут все контролы
end
function cheat:InitCallBacks()
-- здесь будут все каллбаки (ну или обработчики)
end
-- сразу созадим ф-ию для выхода
function cheat:on_quit()
local console = get_console()
self:GetHolder():start_stop_menu (self.owner, true)
self:GetHolder():start_stop_menu (self,true)
self.owner:Show (true)
-- если мы вызывались из игры, то убираем главное меню
if level.present() and (db.actor ~= nil) and db.actor:alive() then
console:execute("main_menu off")
end
end
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл ui_main_menu.script, идем в самый конец и ищем там такую ф-ию:
function main_menu:OnKeyboard(dik, keyboard_action)
Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в lua_help.script (ищите строку C++ class DIK_keys). Итак, вместо
-- if dik == DIK_keys.DIK_S then -- self:OnButton_load_spawn() -- else if dik == DIK_keys.DIK_Q then self:OnMessageQuitWin() end
мы напишем
-- раскоментируем и заоодно включим убранное спавн меню if dik == DIK_keys.DIK_S then self:OnButton_load_spawn() elseif dik == DIK_keys.DIK_Q then self:OnMessageQuitWin() -- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_cheat() elseif dik == DIK_keys.DIK_F1 then self:OnButton_cheat() end
То есть при нажатии на S будет вызывать спавн меню, на Q - мгновенный выход из игры, ну а F1 запустит функцию OnButton_cheat(). То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:
function main_menu:OnButton_cheat() -- если еще ни разу не вызывали, то обозначим наш новый скрипт if self.cheat_dlg == nil then self.cheat_dlg = ui_cheat.cheat() self.cheat_dlg.owner = self end -- останавливаем родительский элемент, запускаем свой, но родителя показываем. self:GetHolder():start_stop_menu(self.cheat_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(true) end
Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу ui_cheat.script и сделаем там обработчик нажатий клавиш. В конец файла допишем:
function cheat:OnKeyboard(dik, keyboard_action) CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then -- сразу же производим действия для возврата self:on_quit() -- на выход повесим Esc if dik == DIK_keys.DIK_ESCAPE then -- тут ничего не делаем end end return true end
Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем F1, анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнял, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем Esc и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)
Предметы
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец ui_cheat.script):
-- spawn_item - необходимый предмет -- dist - радиус появления (случайно) -- disp - некий разброс, чтобы не было спавна прямо в игрока function cheat:spawn_item(spawn_item, dist, disp) local position = vector():set(0,0,0) position.x = db.actor:position().x + math.random(-dist,dist) + disp position.z = db.actor:position().z + math.random(-dist,dist) + disp position.y = db.actor:position().y + disp alife():create(spawn_item, position, 1, db.actor:game_vertex_id()) end
Теперь необходимо вызвать эту функцию. Привяжем кнопки 1 и 2 на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию cheat:OnKeyboard после строки:
if dik == DIK_keys.DIK_ESCAPE then
добавим следующее:
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1() elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()
и создадим эти функции (опять добавляем в конец файла):
function cheat:cheat1()
-- колдуем грозу в радиусе 2 метров плюс 1 метр
self:spawn_item("wpn_groza", 2, 1)
end
function cheat:cheat2()
self:spawn_item("ammo_9x39_sp5", 2, 1)
end
Траспорт
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.
Создадим новый файл с именем cars_spawn.ltx
[ven_niva] class = SCRPTCAR cform = skeleton visual = physics\vehicles\niva\veh_niva_u_01.ogf
Сохраним его к остальным конфигам транспорта, то есть в config\models\vehicles. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем system.ltx. В начале файла есть множество команд #include ..., они подключают конфиги. найдем последний include и добавим наш конфиг:
#include "models\vehicles\cars_spawn.ltx"
Далее по накатанной дорожке. Допишем функцию вызова спавна:
function cheat:cheat3()
self:spawn_item("ven_niva", 5, 1)
end
и назначим ей кнопку 3 на цифровой клавиатуре:
elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.
Продолжение следует... --HikeR 06:34, 20 мая 2007 (MSD)