|
| | |
|
Назначение скриптам горячих кнопок. Часть 1. Скрипт
Назначение скриптам горячих кнопок. Часть 1. Скрипт Вступление Поизучав мод от камрада 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 - радиус появления (случайно) function cheat:spawn_item(spawn_item, dist) local pos = db.actor:position() local dir = db.actor:direction() pos = pos:add(dir:mul(dist)) -- создаем предмет в dist метрах прямо перед нами alife():create(spawn_item, pos, 1, db.actor:game_vertex_id()) end Добавление от HikeR. Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах. Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов и вызываться нужная. В С++ это называется "перегрузка" (если не ошибаюсь ;) Теперь необходимо вызвать эту функцию. Привяжем кнопки 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() Можно спавнить предметы прямо в инвентарь -- Neo][ Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров): function cheat:spawn_item(spawn_item) alife():create (spawn_item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end и создадим эти функции (опять добавляем в конец файла): function cheat:cheat1() -- колдуем грозу на расстоянии 3 метров. self:spawn_item("wpn_groza", 3) end function cheat:cheat2() self:spawn_item("ammo_9x39_sp5", 3) 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, 10) end и назначим ей кнопку 3 на цифровой клавиатуре: elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3() Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы. Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности. Продолжение следует... Монстры Аналогично добавляем монстров и прочую живность. Функция: function cheat:cheat4() -- создаем монстра подальше от нас self:spawn_item("dog_weak", 20) end Обработка клавиши 4 elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4() Сон по желанию Если у Вас установлен Dream mod, то можно и его повесить на кнопку. function cheat:cheat5() sleep_manager.sleep_three_hours() end Предполагается, что имя скрипта sleep_manager.script, а в нем есть функция sleep_three_hours(), то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться. Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело. Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает. Внимание!!! При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед Желательно выбирать ровную поверхность, либо поверхность с наклоном от игрока. Если спавнить в гору - то предмет вообще не появится, вернее он появится, но провалится под уровень. Ссылки на ресурсы Полный текст скрипта ui_cheats.script Благодарности · Jeppa - за толчок в сторону изучения этой стороны скриптинга · Red75 - за расчет координат спавна (появление прямо перед нами) Что дальше? А дальше плавно переходим к облагораживанию, иначе говоря - к интерфейсу. --HikeR 23:37, 20 мая 2007 (MSD)
|
Категория: Моддинг | Добавил: Gluck (22.07.2012)
|
Просмотров: 912
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
| |