Меню сайта

Категории раздела
Моды Сталкер Зов Припяти [78]
Моды Сталкер Чистое Небо [39]
Моды Сталкер Тени Чернобыля [238]

Популярный мод:

Мод Торрент:

Легенды Зоны

Связь с Администрацией На форум Файлы
Нравится ли вам Новый дизайн сайта?
Всего ответов: 73
Главная » Файлы » Моды Сталкер » Моды Сталкер Зов Припяти [ Добавить материал ]

Спавн-через меню (Все части СТАЛКЕР)
28.06.2016, 23:01

Нам понадобятся следующие распакованные (или имеющиеся) файлы: 
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: сначала снять с паузы, а потом спать. Тогда все работает. 

Внимание!!! 

При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед 

Желательно выбирать ровную поверхность, либо поверхность с наклоном от игрока. Если спавнить в гору - то предмет вообще не появится, вернее он появится, но провалится под уровень. 

Категория: Моды Сталкер Зов Припяти | Добавил: Graf
Просмотров: 2587 | Загрузок: 0 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Форма входа
12.06.2025 - Четверг



Вы вошли как:
Гость
Группа: Гости
На сайте: -й день
Личных сообщений:
Ваш Ip: 216.73.216.142



Поиск

Новая Аудиокина

Новая Книга

Мы ВКонтакте!

Статистика

Всего бродяг: 3
Отмычек: 3
Опытных: 0

Бесплатный хостинг uCozЯндекс.Метрика
Design by SS-Studio.ru©