Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
Карлан 1 050 Опубликовано 9 Августа 2016 Поделиться Опубликовано 9 Августа 2016 На мой взгляд проще добавить функцию в движок, где можно установить и кастом дату (ее наверное лучше вообще отдельной функцией сделать, у меня, например, по всякому сделано), и топливо, и прочие специфичные параметры вроде стейтов дверей (тут могу ошибиться, в транспорте совершенно не разбираюсь). Самое банальное - сделать еще один create, где опционально можно указать story id и custom data. Далее, если нужно, древовидно раскрутить все функции и вписывать туда специфичные параметры, далее их ассоциативно экспортировать в скрипты, в принципе это один из немногих хороших вариантов. Если говорить о пакетах, то, если верно помню, там можно через смещение чтения/записи сразу прочесть/записать нужный параметр и не писать все это полотно, по крайней мере я так когда-то давно визуал читал. Ну а оперировать этим через [spawner] это, конечно, ужасно. 1 Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 (изменено) Добрый день. Есть у меня меню. В нем есть кнопка и "static". В "static'е" есть текст который записан в .xml файле. Как мне изменить этот текст при нажатии на кнопку. Вот меню: class "test" (CUIScriptWnd) function test:__init() super() self:InitControls() self:InitCallBacks() end function test:__finalize() end function test:InitControls() local xml = CScriptXmlInit() self:Init(0,0,1024,768) xml:ParseFile("ui_test.xml") self.glb_fon = xml:InitStatic("glb_fon", self) -- Фон всего меню self:Register(xml:Init3tButton("glb_fon:button", self.glb_fon), "button") -- Кнопка self.txtt = xml:InitStatic("glb_fon:txtt", self.glb_fon) -- Текст который мне нужно изменить скриптом end function test:InitCallBacks() self:AddCallback("button", ui_events.BUTTON_CLICKED, self.button_button_clicked, self) end function test:button_button_clicked() ...("Новый текст для static, который завется txtt.") end function test:Hide() self:GetHolder():start_stop_menu(self, true) end Изменено 10 Августа 2016 пользователем HellRatz Ссылка на комментарий
naxac 2 545 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 @Kober(BRUC), ТЧ/ЧН: self.txtt:SetText("Новый текст для static, который завется txtt.")ЗП: self.txtt:TextControl():SetText("Новый текст для static, который завется txtt.") 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 (изменено) Вот меню: local ver_gm = "" -- Не удалять! class "ver_game" (CUIScriptWnd) function ver_game:__init() super() self:InitControls() self:InitCallBacks() end function ver_game:__finalize() end function ver_game:InitControls() local xml = CScriptXmlInit() self:Init(0,0,1024,768) xml:ParseFile("ui_ver_game.xml") self.glb_fon = xml:InitStatic("glb_fon", self) -- Фон всего меню self:Register(xml:Init3tButton("glb_fon:chek", self.glb_fon), "chek") -- Проверка версии игры self:Register(xml:Init3tButton("glb_fon:exit", self.glb_fon), "exit") -- Выход self.txtt = xml:InitStatic("glb_fon:txtt", self.glb_fon) -- Текст end function ver_game:InitCallBacks() self:AddCallback("chek", ui_events.BUTTON_CLICKED, self.chek_button_clicked, self) -- каллбэк на нажатие кнопку chek self:AddCallback("exit", ui_events.BUTTON_CLICKED, self.exit_button_clicked, self) -- каллбэк на нажатие кнопку exit end function ver_game:chek_button_clicked() -- Что происходит если нажать на кнопку chek if tonumber(_G.main_menu.get_main_menu():GetGSVer()) <= 1.0004 then local ver_gm = "1.0004 или меньше" noo() elseif tonumber(_G.main_menu.get_main_menu():GetGSVer()) == 1.0005 then local ver_gm = "1.0005" noo_two() elseif tonumber(_G.main_menu.get_main_menu():GetGSVer()) == 1.0006 then local ver_gm = "1.0006" yess() end end function ver_game:exit_button_clicked() -- Что происходит если нажать на кнопку exit self:GetHolder():start_stop_menu (self.owner, true) self:GetHolder():start_stop_menu (self,true) end function ver_game:Hide() -- Выход self:GetHolder():start_stop_menu(self, true) end function noo() self.txtt:SetText("Плохо! Ваша версия игры: "..ver_gm.." Установите патч 1.0006.") end function noo_two() self.txtt:SetText("Ужасно! Ваша версия игры: "..ver_gm.." Установите патч 1.0006") end function yess() self.txtt:SetText("Отлично! Ваша версия игры: "..ver_gm) end При нажатии кнопки chek(chek_button_clicked) ловлю вылет: Expression : fatal error Function : CScriptEngine::lua_errorFile : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cppLine : 73Description :Arguments : LUA error: d:\game\soc\gamedata\scripts\ver_game.script:60: attempt to index global 'self' (a nil value) С чем это связано? Изменено 10 Августа 2016 пользователем BFG Добавлено BFG, 10 Августа 2016 Строгое Предупреждение !!! Такие полотна прячем под спойлер ! Ссылка на комментарий
naxac 2 545 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 (изменено) @Kober(BRUC), с тем, что функция, в которой ты обращаешься к self, не является методом никакого класса. Соответственно, и self в ней равен nil. И, заодно, здесь: if tonumber(_G.main_menu.get_main_menu():GetGSVer()) <= 1.0004 then local ver_gm = "1.0004 или меньше"И ниже - надо убрать local, т.к. с его помощью инициализируется новая переменная, которая действует только до elseif. Изменено 10 Августа 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 (изменено) надо убрать local, т.к. с его помощью инициализируется новая переменная, которая действует только до elseif.Даже если в начале скрипта есть:local ver_gm = ""? Я считал что если есть, то будет работать на весь код. Изменено 10 Августа 2016 пользователем Kober(BRUC) Ссылка на комментарий
naxac 2 545 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 В начале - да, она будет действовать во всем коде ниже ее. Но далее - ты каждый раз делаешь новую переменную, которая будет удалена после завершения блока кода. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
dPlayer 550 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 (изменено) Выполнить ф-ию при подборе одного из нескольких предметов. Читал-читал про оператор or, но всё равно вылет((: function find_item_i(actor, npc) if db.actor ~= nil then return db.actor:object("предмет1")~=nil or return db.actor:object("предмет2")~=nil end end return false end Изменено 14 Августа 2016 пользователем dPlayer Самый некомпетентный на форуме. Ссылка на комментарий
Overfirst 637 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 (изменено) return db.actor:object("предмет1")~=nil or return db.actor:object("предмет2")~=nil Убери второй return. И end'а должно быть два, а не три. function find_item_i(actor, npc) if db.actor then return db.actor:object("предмет1")~=nil or db.actor:object("предмет2")~=nil end return false end И не надо проверять актора на nil, достаточно просто if db.actor then ... end Да и не в операторе дело, а в синтаксических ошибках. Юзай script_syntax_checker или плагин от @Charsi для Notepad'а, если пользуешься им. Оч. удобная штука. Изменено 14 Августа 2016 пользователем BoBaH_671 1 1 Ранее был известен под ником BoBaH_671. Ссылка на комментарий
Expropriator 2 119 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 @BoBaH_671, как визуально можно быстро определить количество end. Это мой метод (может неверный). function - одна последняя (закрывающая функцию) endif - вторая внутренняя end Сколько if, столько end плюсуем. 1 1 1 Ссылка на комментарий
Kondr48 314 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 Дизель, for и while также требуют end. 2 1 Ссылка на комментарий
Romann 623 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 А лучше писать скрипты хотя бы в "Notepad++"(там есть синтаксис луа, и видно где нужно закрыть функцию), а не в блокноте... 3 1 Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 15 Августа 2016 Поделиться Опубликовано 15 Августа 2016 Такой вопрос. Через скрипт отрисовываю по координатам ГГ партикл(снег), но рисуеться он как бы в стороне от ГГ, и иногда выглядит это совсем некрасиво, и нереалистично. Вот сама функция: if not self.particles thenself.particles=particles_object("ghoul\\global_snow")self.particles:play_at_pos( db.actor:position() )endif self.particles thenself.particles:move_to(db.actor:position(),vector():set(10,2,15))end На месте цифр 10,2,15 стояли нули в исходном варианте, я думал добавить значение для вектора ,тем самым сместить положение точки отрисовки, но ничего не изменилось. Подскажите, как возможно решить проблему. Может быть сначала поработать с координатами ГГ, попробовать поприбовлять к ним значения исходя из данного относительно времени? Тоесть как бы подменять их на новые в рамках функции. Подскажите, у кого какие идеи... Не соответствует правилам. Ссылка на комментарий
Карлан 1 050 Опубликовано 15 Августа 2016 Поделиться Опубликовано 15 Августа 2016 @CRAZY_STALKER666, предположу, что партикл рисуется по позиции объекта, а ты негодуешь из-за того, что он "не там" от первого лица, то есть от позиции камеры. Попробуй рисовать партикл от позиции камеры. Ссылка на комментарий
Kondr48 314 Опубликовано 15 Августа 2016 Поделиться Опубликовано 15 Августа 2016 Карлан, а разве камера так далеко от позиции ГГ? Насколько я видел зимние партиклы там что то типа облака метров на 10-15 вокруг ГГ, вряд ли там такая уж разница. CRAZY_STALKER666, что мешает посмотреть любой зимний мод, в котором это работает? Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 15 Августа 2016 Поделиться Опубликовано 15 Августа 2016 что мешает посмотреть любой зимний мод, в котором это работает? Отвечу - материал взят именно из него. Там это в таком кривом варианте и оставлено... Не соответствует правилам. Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 Доброе утро. Хотел узнать. Есть папка scripts в которой находятся все скрипты. И допустим мы взяли оттуда скрипт. Любой. И в любой функции вызываем другую функцию. Но только не из этого файла. А из другого. А теперь сам вопрос. Можно ли вызывать эту функцию из другого файла, который лежит не в папке scripts, а например в scripts/add? И как это делать? Или так и вызывать? Название_файла.Название_функции()? А в какой папке лежит - не важно? Главное что бы в директории scripts/... Ссылка на комментарий
Карлан 1 050 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 @Kober(BRUC), в оригинале без костылей это невозможно. Для скриптов существует свой относительный путь, называется $game_scripts$ и явно прописан в fsgame.ltx. Чтобы скрипты можно было вызывать откуда угодно нужно переделывать функцию вызова скриптов в движке, файл script_engine.cpp. Я ее немного переделывал там чтобы хотя бы самых больших мух от котлет отделить, а вот alpet, насколько я знаю, переделывал ее примерно так как тебе и надо, у него, опять же насколько я знаю, скрипты можно вызывать из папки scripts и всех ее подпапок. Я в плюсах слабо рублю, но мне кажется это такая плюсовая плюшка (то есть не составляет большого труда, для тех кто в них шарит), сделать цикл не только по $game_scripts$, но и по всем вложенным папкам. На луа, костылем, это, разумеется, можно сделать через dofile. Но поскольку это костыль, то и путь надо будет каждый раз писать для update_path для каждой новой подпапки, не совсем удобно, ну и разумеется уже pcall. 1 Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 @Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет? Ссылка на комментарий
Карлан 1 050 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 upd: Взгляни на ResourceManager_Scripting.cpp, // load shaders и далее, там как раз вот идеология того, что тебе нужно, думаю можно разобраться, цикл то маленький, а я тут напугал, даже я примерно въехал что к чему . Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет? Ну нет конечно, если ты его заранее через луа явно не подключишь, и то скорее всего не взлетит, потому что модули с диалоговыми функциями это нечто большее, чем скрипты 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти