Карлан 1 049 Опубликовано 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 447 Опубликовано 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 447 Опубликовано 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 447 Опубликовано 10 Августа 2016 Поделиться Опубликовано 10 Августа 2016 В начале - да, она будет действовать во всем коде ниже ее. Но далее - ты каждый раз делаешь новую переменную, которая будет удалена после завершения блока кода. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
dPlayer 500 Опубликовано 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 631 Опубликовано 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 118 Опубликовано 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 049 Опубликовано 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 049 Опубликовано 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 049 Опубликовано 18 Августа 2016 Поделиться Опубликовано 18 Августа 2016 upd: Взгляни на ResourceManager_Scripting.cpp, // load shaders и далее, там как раз вот идеология того, что тебе нужно, думаю можно разобраться, цикл то маленький, а я тут напугал, даже я примерно въехал что к чему . Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет? Ну нет конечно, если ты его заранее через луа явно не подключишь, и то скорее всего не взлетит, потому что модули с диалоговыми функциями это нечто большее, чем скрипты 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти