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/
Jekyll 92 Опубликовано 26 Июля 2021 Поделиться Опубликовано 26 Июля 2021 Здравствуйте. Как определить, принадлежит ли определенный гейм-вертекс текущей локации? ЗП. New Anomalies 1.1 ☢☢☢ "Смерть-лампа" ☢☢☢ Дисраптор Русификатор для игры Vendetta: Curse of Raven's Cry Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391225
WinCap 324 Опубликовано 26 Июля 2021 Поделиться Опубликовано 26 Июля 2021 @Jekyll, как-то так: local gvid = определенный_m_game_vertex_id local level_name = alife():level_name(game_graph():vertex(gvid):level_id()) if level_name == level.name() then 1 S.T.A.L.K.E.R. CoP Objects >200 шт (upd 21.05.26) - Скачать (Яндекс-диск) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391228
Norman Eisenherz 355 Опубликовано 27 Июля 2021 Поделиться Опубликовано 27 Июля 2021 Здрасьте. ТЧ 1.0006. Задача: действие по нажатию кнопки в инвентаре. Построение: присоединить кнопку к инвентарю при первом обращении, создать скриптовое окно и сохранить в переменной, привязать событие. Проблема: скриптовое окно вызывает безлоговый вылет после перезагрузки и повторного обращения к инвентарю. Обнуление скриптового окна при выходе из инвентаря или через net_destroy не помогает. Как правильно очистить окно при перезагрузке? Spoiler local inv, z, wnd -- инвентарь, кнопка и окно для отслеживания нажатия кнопки -- [bind_stalker.script] actor_binder:info_callback function button(info_id) if info_id == "ui_inventory" then local b_name = "btn" if not inv then inv = level.main_input_receiver() z = CUI3tButton() inv:AttachChild(z) local x, y = 755, 245 local w, h = 157, 48 z:Init("ui_button_main03", x, y, w, h) end if not wnd then wnd = CUIScriptWnd() wnd:Init(0, 0, 1, 1) wnd:Register(z, b_name) wnd:AddCallback(b_name, ui_events.BUTTON_CLICKED, action, wnd) end elseif info_id == "ui_inventory_hide" then wnd = nil end end function action() news_manager.send_tip(db.actor, "TEST") end -- [bind_stalker.script] actor_binder:net_spawn function delete() wnd = nil end Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391255
I am Dead 918 Опубликовано 27 Июля 2021 Поделиться Опубликовано 27 Июля 2021 1 час назад, Norman Eisenherz сказал: Как правильно очистить окно при перезагрузке? Вот так if wnd then wnd:DetachWnd() wnd = nil end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391257
AndreySol 215 Опубликовано 27 Июля 2021 Поделиться Опубликовано 27 Июля 2021 18 часов назад, phalcor сказал: В общем, у меня задача стояла такая - определить, является ли запрашиваемый параметр оружия "родным" (прописанным непосредственно под секцией это оружия), или же он наследуемый. Мне когда такое понадобилось - сделал движковую правку. @Norman Eisenherz z:SetAutoDelete(true) - должно помочь. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391267
naxac 2 605 Опубликовано 27 Июля 2021 Поделиться Опубликовано 27 Июля 2021 (изменено) 5 часов назад, Norman Eisenherz сказал: Как правильно очистить окно при перезагрузке? При net_destroy надо отсоединять элементы от окна: if inv then inv:DetachChild(z) inv, wnd, z = nil, nil, nil end Изменено 27 Июля 2021 пользователем naxac 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391271
Norman Eisenherz 355 Опубликовано 27 Июля 2021 Поделиться Опубликовано 27 Июля 2021 По результатам проверки хватило принудительного отсоединения кнопки – AutoDelete работает и так для всех окон. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391297
phalcor 60 Опубликовано 28 Июля 2021 Поделиться Опубликовано 28 Июля 2021 Доброго дня! Скажите, а досрочный выход из цикла iterate предусмотрен? Return явно не работает, ибо в log я получаю iter=50. local i=0 db.actor:iterate_inventory_simple(function(item) i=i+1 if item then return end end) log("iter="..i) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391350
dsh 3 825 Опубликовано 28 Июля 2021 Поделиться Опубликовано 28 Июля 2021 @phalcor @phalcor что-то я не нахожу в движке такого метода. iterate_inventory нахожу, а iterate_inventory_simple нету. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391354
Zander_driver 10 358 Опубликовано 28 Июля 2021 Поделиться Опубликовано 28 Июля 2021 1 час назад, phalcor сказал: Return явно не работает Работает. Он выходит из тела анонимной функции. Вот этой: 1 час назад, phalcor сказал: function(item) i=i+1 if item then return end end А iterate_inventory или его аналоги, запускает задание на циклический вызов указанной функции. И для отмены/прерывания задания, метода нету. Но, а зачем он нужен? Можно же сделать что-то в таком духе: local i=0 local ido = true db.actor:iterate_inventory(function(item) if ido then -- Здесь наши действия если перебор продолжается i=i+1 if item then ido = false end else -- Здесь - если нет return end end) log("iter="..i) Только что, dsh сказал: я не нахожу в движке такого метода. Кстати, я тоже. Все равно какая-то вариация на тему, по образу и подобию... не все ли равно?) 1 Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил. Я понял что моя старая подпись что-то нарушает. Удалил все ссылки. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391358
phalcor 60 Опубликовано 28 Июля 2021 Поделиться Опубликовано 28 Июля 2021 @dsh это из движка ОП 2.1. Но суть не в том, стандартный iterate ведёт себя так же (без выхода по return!): local i=0 db.actor:iterate_inventory( function(dummy,item) i=i+1 if item then return end end,db.actor) log("iter2="..i) @Zander_driver 2 минуты назад, Zander_driver сказал: Можно же сделать что-то в таком духе: Можно конечно, но прогонка цикла, когда он уже не нужен, отнимает время (пусть и малое). Я-то думал, есть волшебный break! Ну нет, так нет :-) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391359
Zander_driver 10 358 Опубликовано 28 Июля 2021 Поделиться Опубликовано 28 Июля 2021 Только что, phalcor сказал: стандартный iterate ведёт себя так же Естественно так же. Любой подобный итератор делает простую вещь - запускает в движке цикл перебора, в котором вызывается указанная функция. Т.к. цикл крутится в движке, остановить его из скриптов естественно невозможно. Будет крутиться до тех пор пока все итемы не переберет. Но его и не нужно останавливать ни для чего... Только что, phalcor сказал: прогонка цикла, когда он уже не нужен, отнимает время (пусть и малое). Ну формально да. Но, т.к. это цикл в движке - это очень малое время. Очень. В среднестатистическом моде, есть куда более весомые вещи, которые можно оптимизировать. 1 Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил. Я понял что моя старая подпись что-то нарушает. Удалил все ссылки. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391360
dsh 3 825 Опубликовано 28 Июля 2021 Поделиться Опубликовано 28 Июля 2021 3 hours ago, Zander_driver said: не все ли равно?) Нет. Возможно там сделали возможность досрочного выхода из цикла, кто знает. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391370
WinCap 324 Опубликовано 28 Июля 2021 Поделиться Опубликовано 28 Июля 2021 9 часов назад, phalcor сказал: досрочный выход из цикла iterate предусмотрен? В стандартном методе "iterate_inventory" точно нет, а в неизвестном "iterate_inventory_simple" - всё может быть. Попробуй вернуть что-нибудь из функции, например "true". Скрытый текст local i=0 db.actor:iterate_inventory_simple(function(item) i=i+1 if item then return true end end) log("iter="..i) 1 S.T.A.L.K.E.R. CoP Objects >200 шт (upd 21.05.26) - Скачать (Яндекс-диск) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391398
AndreySol 215 Опубликовано 29 Июля 2021 Поделиться Опубликовано 29 Июля 2021 18 часов назад, phalcor сказал: Скажите, а досрочный выход из цикла iterate предусмотрен? Return явно не работает А ничего, что return, в твоем примере кода, вызывается в кэллбэк-ф-ции, которая, в свою очередь, вызывается из движка для каждого имеющегося предмета инветаря? Смотри пример ниже, там специально кэллбэк-ф-ция вынесена отдельно: local npc_obj = level.object_by_id(alife():story_object(104).id) if npc_obj then npc_obj:iterate_inventory(check_inv_items, npc_obj) end function check_inv_items(npc, item) ....... return ....... end Соответственно, понятно, что область действия оператора return ограничена ф-цией check_inv_items, и уж никак не може влиять на npc_obj:iterate_inventory. Или я не прав? 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391427
Zander_driver 10 358 Опубликовано 29 Июля 2021 Поделиться Опубликовано 29 Июля 2021 @AndreySol Это разобрали несколькими постами ранее... 1 Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил. Я понял что моя старая подпись что-то нарушает. Удалил все ссылки. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391431
naxac 2 605 Опубликовано 29 Июля 2021 Поделиться Опубликовано 29 Июля 2021 (изменено) 28.07.2021 в 19:40, phalcor сказал: досрочный выход из цикла iterate предусмотрен? Можно вместо iterate_inventory использовать local obj for i = 0, db.actor:object_count()-1 do obj = db.actor:object(i) ... end Тут можно и break, и return использовать. Изменено 29 Июля 2021 пользователем naxac 1 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391485
Norman Eisenherz 355 Опубликовано 29 Июля 2021 Поделиться Опубликовано 29 Июля 2021 Здрасьте. ТЧ 1.0006. Безлоговый вылет при удалении простого скриптового окна, если оно открыто в момент перезагрузки (ситуация "смерть или переход при открытом инвентаре"). Проблема в том, что вылет случается только на сейвах, сделанных после начала задания Волка – дефолтный сейв all.sav не сбоит. Условия теста: • оставить в папке [gamedata] только указанный ниже файл • начать новую игру • открыть инвентарь с новым окном • консоль: load_last_save -- нет вылета • взять задание Волка • сделать сейв • открыть инвентарь и новым окном • консоль: load_last_save -- вылет Может, так и должно быть, а метод __finalize() нужен только для того, чтобы сборщик мусора не пытался убить окно на ближайшем апдейте? Spoiler [scripts\bind_stalker.script] function actor_binder:info_callback(npc, info_id) (+) if info_id == "ui_inventory" then show() end (+) function show() cui = test() level.start_stop_menu(cui) end class "test" (CUIScriptWnd) function test:__init() super() self:Init(0, 0, 1024, 768) local b = CUIStatic() self:AttachChild(b) b:Init(0, 0, 1024, 768) b:InitTexture("ui_frame_back") b:SetStretchTexture(true) end function test:__finalize() end Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391503
I am Dead 918 Опубликовано 30 Июля 2021 Поделиться Опубликовано 30 Июля 2021 @Norman Eisenherz А убирать окно кто будет? Странно что при повторном открытии инвентаря вылет не ловишь. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391508
Norman Eisenherz 355 Опубликовано 30 Июля 2021 Поделиться Опубликовано 30 Июля 2021 @I am Dead Точнее, пожалуйста: кого, куда и как убирать. Добавлять к указанному коду cui = nil в net_destroy бесполезно, cui:GetHolder():start_stop_menu(cui) там же вообще не находит ссылки на окно. Если вывести интерактивное окно при закрытых движковых окнах, оно удаляется без дополнительных действий (в ТЧ – в ЧН/ЗП уже нет) – проверял оба вида окон на одном сейве. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/570/#findComment-1391509
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти