Среда, 14.01.2026, 11:25
Приветствую Вас Гость | RSS
F.R.O.N.T.
Главная | Статьи | Регистрация | Вход
Меню сайта
Все новые статьи находяться на форуме!!! Видеть их могут только рарегистрированые пользователи...
Категории каталога
Мои статьи [28] Сценарии [0]
Пишите сюда свои сцинарии
Модострой [152]
Статьи по созданию модов
КАК СНЯТЬ ФИЛЬМ??? [0]
Статьи о том как снять фильмы
Мини-чат
Наш опрос
Стали бы вы смотреть фильм который снят фанатами "Сталкера"?
1. Да, обязательно
2. Если только не кочать
3. Наверно
4. Нет
5. Нет, если там кочество плохое
6. Нет, если надо качать
Всего ответов: 81
Главная » Статьи » Модострой

Назначение скриптом горячих клавиш 1
Назначение скриптам горячих кнопок. Часть 1. Скрипт
Материал из S.T.A.L.K.E.R. Inside Wiki.
Перейти к: навигация, поискСодержание
1 Вступление
2 Скрипт
3 Предметы
4 Траспорт
5 Монстры
6 Сон по желанию
7 Внимание!!!
8 Ссылки на ресурсы
9 Благодарности
10 Что дальше?

Вступление

Поизучав мод от камрада 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 Можно спавнить предметы прямо в инвентарь -- 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



Добавление от 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
Благодарности
Jeppa - за толчок в сторону изучения этой стороны скриптинга
Red75 - за расчет координат спавна (появление прямо перед нами)
Что дальше?

А дальше плавно переходим к облагораживанию, иначе говоря - к интерфейсу.









Категория: Модострой | Добавил: front (24.04.2008)
Просмотров: 2182 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
счетчик посещенийсчетчик посещений
Друзья сайта
 
Фан сайт игры S.T.A.L.K.E.R.

Бар_У_границы_Зоны_бар_настоящего_сталкера!

Статистика

На портале: 1
Новичков: 1
Участников: 0

Copyright MyCorp © 2026