Назначение скриптам горячих кнопок. Часть 1. Скрипт — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Wasly (обсуждение | вклад) (→Транспорт) |
Wasly (обсуждение | вклад) (→Монстры) |
||
Строка 152: | Строка 152: | ||
end</code> | end</code> | ||
Обработка клавиши '''4''' | Обработка клавиши '''4''' | ||
− | <code lua>elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()</code> | + | <code lua>elseif dik == DIK_keys.DIK_NUMPAD4 then self:cheat4()</code> |
== Сон по желанию == | == Сон по желанию == |
Версия 20:40, 14 октября 2009
Содержание
Вступление
Поизучав мод от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствует, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.
Нам понадобятся следующие распакованные (или имеющиеся) файлы:
config\system.ltx scripts\ui_main_menu.script
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.
Скрипт
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его ui_cheat.script и положим ко всем остальным скриптам.
Вот его содержание: |
---|
-- инициализация |
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например, на 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_ch
Предметы
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец 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()
и создадим эти функции (опять добавляем в конец файла):
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
- Stalker-MOD incl. Fahrzeuge - официальный топик(обсуждение и загрузка)(нем.)
- Обсуждение Jeppa's Vehicle mod на gsc-game.com(англ.)
- Загрузка Jeppa's Vehicle mod на gsc-game.com(англ.)
Благодарности
- Jeppa - за толчок в сторону изучения этой стороны скриптинга
- Red75 - за расчет координат спавна (появление прямо перед нами)
Что дальше?
А дальше плавно переходим к облагораживанию, иначе говоря - к интерфейсу.
--HikeR 23:37, 20 мая 2007 (MSD)