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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Карлан 1 050 Опубликовано 9 Августа 2016 Поделиться Опубликовано 9 Августа 2016 На мой взгляд проще добавить функцию в движок, где можно установить и кастом дату (ее наверное лучше вообще отдельной функцией сделать, у меня, например, по всякому сделано), и топливо, и прочие специфичные параметры вроде стейтов дверей (тут могу ошибиться, в транспорте совершенно не разбираюсь). Самое банальное - сделать еще один create, где опционально можно указать story id и custom data. Далее, если нужно, древовидно раскрутить все функции и вписывать туда специфичные параметры, далее их ассоциативно экспортировать в скрипты, в принципе это один из немногих хороших вариантов. Если говорить о пакетах, то, если верно помню, там можно через смещение чтения/записи сразу прочесть/записать нужный параметр и не писать все это полотно, по крайней мере я так когда-то давно визуал читал. Ну а оперировать этим через [spawner] это, конечно, ужасно. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1031223
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1031234
naxac 2 578 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 @Kober(BRUC), ТЧ/ЧН: self.txtt:SetText("Новый текст для static, который завется txtt.")ЗП: self.txtt:TextControl():SetText("Новый текст для static, который завется txtt.") 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1031236
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1031250
naxac 2 578 Опубликовано 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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1031260
Kober(BRUC) 99 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 (изменено) надо убрать local, т.к. с его помощью инициализируется новая переменная, которая действует только до elseif.Даже если в начале скрипта есть:local ver_gm = ""? Я считал что если есть, то будет работать на весь код. Изменено 10 Августа 2016 пользователем Kober(BRUC) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1031264
naxac 2 578 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 В начале - да, она будет действовать во всем коде ниже ее. Но далее - ты каждый раз делаешь новую переменную, которая будет удалена после завершения блока кода. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1031274
dPlayer 552 Опубликовано 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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032050
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032051
Expropriator 2 119 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 @BoBaH_671, как визуально можно быстро определить количество end. Это мой метод (может неверный). function - одна последняя (закрывающая функцию) endif - вторая внутренняя end Сколько if, столько end плюсуем. 1 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032053
Kondr48 314 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 Дизель, for и while также требуют end. 2 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032059
Romann 623 Опубликовано 14 Августа 2016 Поделиться Опубликовано 14 Августа 2016 А лучше писать скрипты хотя бы в "Notepad++"(там есть синтаксис луа, и видно где нужно закрыть функцию), а не в блокноте... 3 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032064
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 стояли нули в исходном варианте, я думал добавить значение для вектора ,тем самым сместить положение точки отрисовки, но ничего не изменилось. Подскажите, как возможно решить проблему. Может быть сначала поработать с координатами ГГ, попробовать поприбовлять к ним значения исходя из данного относительно времени? Тоесть как бы подменять их на новые в рамках функции. Подскажите, у кого какие идеи... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032249
Карлан 1 050 Опубликовано 15 Августа 2016 Поделиться Опубликовано 15 Августа 2016 @CRAZY_STALKER666, предположу, что партикл рисуется по позиции объекта, а ты негодуешь из-за того, что он "не там" от первого лица, то есть от позиции камеры. Попробуй рисовать партикл от позиции камеры. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032264
Kondr48 314 Опубликовано 15 Августа 2016 Поделиться Опубликовано 15 Августа 2016 Карлан, а разве камера так далеко от позиции ГГ? Насколько я видел зимние партиклы там что то типа облака метров на 10-15 вокруг ГГ, вряд ли там такая уж разница. CRAZY_STALKER666, что мешает посмотреть любой зимний мод, в котором это работает? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032269
CRAZY_STALKER666 36 Опубликовано 15 Августа 2016 Поделиться Опубликовано 15 Августа 2016 что мешает посмотреть любой зимний мод, в котором это работает? Отвечу - материал взят именно из него. Там это в таком кривом варианте и оставлено... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032358
Kober(BRUC) 99 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 Доброе утро. Хотел узнать. Есть папка scripts в которой находятся все скрипты. И допустим мы взяли оттуда скрипт. Любой. И в любой функции вызываем другую функцию. Но только не из этого файла. А из другого. А теперь сам вопрос. Можно ли вызывать эту функцию из другого файла, который лежит не в папке scripts, а например в scripts/add? И как это делать? Или так и вызывать? Название_файла.Название_функции()? А в какой папке лежит - не важно? Главное что бы в директории scripts/... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032746
Карлан 1 050 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 @Kober(BRUC), в оригинале без костылей это невозможно. Для скриптов существует свой относительный путь, называется $game_scripts$ и явно прописан в fsgame.ltx. Чтобы скрипты можно было вызывать откуда угодно нужно переделывать функцию вызова скриптов в движке, файл script_engine.cpp. Я ее немного переделывал там чтобы хотя бы самых больших мух от котлет отделить, а вот alpet, насколько я знаю, переделывал ее примерно так как тебе и надо, у него, опять же насколько я знаю, скрипты можно вызывать из папки scripts и всех ее подпапок. Я в плюсах слабо рублю, но мне кажется это такая плюсовая плюшка (то есть не составляет большого труда, для тех кто в них шарит), сделать цикл не только по $game_scripts$, но и по всем вложенным папкам. На луа, костылем, это, разумеется, можно сделать через dofile. Но поскольку это костыль, то и путь надо будет каждый раз писать для update_path для каждой новой подпапки, не совсем удобно, ну и разумеется уже pcall. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032766
Kober(BRUC) 99 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 @Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032768
Карлан 1 050 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 upd: Взгляни на ResourceManager_Scripting.cpp, // load shaders и далее, там как раз вот идеология того, что тебе нужно, думаю можно разобраться, цикл то маленький, а я тут напугал, даже я примерно въехал что к чему . Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет? Ну нет конечно, если ты его заранее через луа явно не подключишь, и то скорее всего не взлетит, потому что модули с диалоговыми функциями это нечто большее, чем скрипты 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/390/#findComment-1032770
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти