Котовод 90 Опубликовано 8 Февраля 2022 Поделиться Опубликовано 8 Февраля 2022 Ребята, есть какой-то способ принудительного обновления диалогов такого типа? В НЛС они формируются при первой загрузке сейва, что мне не подходит... <dialog id="vergas_repair_dialog" priority="-1"> <precondition>dialogs.is_not_wounded</precondition> <init_func>sak_dialog.vergas_repair_dlg</init_func> </dialog> Скрытый текст local vergas_tbl = {} local vergas_bad_tbl = {} function generate_vergas_tbl() local items = get_shadow_inv():get_content( true ) for i, rec in items:ipairs() do local sect = sak_inventory.dyn_art_base( rec.sect ) if ( ( rec.obj:is_weapon() and rec.obj:condition() >= 0.65 and rec.obj:condition() < 1 and not ( str_in_tab( sect, { "wpn_binoc", "wpn_knife", "wpn_flame", "wpn_rpg7", "wpn_pkm", "wpn_gm94", "wpn_ak74_m1" } ) ) ) or ( rec.obj:is_outfit() and rec.obj:condition() >= 0.59 and rec.obj:condition() < 1 and not ( str_in_tab( sect, { "_q_", "bandit_veteran_", "bandit_master_", "exo" } ) ) ) ) then local cfg = this.repair_config[ r_vergas ] if not cfg then wprintf( "[~T].~C0C #ERROR(uniform_repair_cost):~C07 not specified configuration for repairer~C0A %s~C07", r_vergas ) misc.dump_table( this.repair_config ) return end local item_repair_cost = this.calc_repair_cost( rec.obj, this.get_margin( r_vergas ) ) local time_need_repair = this.uniform_time_repair( item_repair_cost, rec.obj:cost(), cfg.price_coefs, cfg.time_repair ) local time_rep = this.time_desc( time_need_repair ) local cost_phrase = "list_trader_repair_" .. lua_random( 1, 7 ) local text = translate( cost_phrase ) .. " %c[255,238,155,23]" .. item_repair_cost .. " %c[255,216,186,140]рублей. " .. time_rep .." ".. translate( "list_time_repair_2" ) table.insert( vergas_tbl, { obj = rec.obj:id(), sect = sect, cost = item_repair_cost, time_need = time_need_repair, text = text } ) -- misc.dump_table( vergas_tbl ) elseif ( ( rec.obj:is_weapon() and rec.obj:condition() < 0.65 ) or ( rec.obj:is_outfit() and rec.obj:condition() < 0.59 ) ) or str_in_tab( sect, { "wpn_flame", "wpn_rpg7", "wpn_pkm", "wpn_gm94", "wpn_ak74_m1", "_q_", "bandit_veteran_", "bandit_master_", "exo" } ) then table.insert( vergas_bad_tbl, sect ) misc.dump_table( vergas_bad_tbl ) end end end function show_not_available() if #vergas_bad_tbl < 1 then return end local text = "" local colour = "%c[ 255, 255, 255, 255 ]" for kk, vv in pairs( vergas_bad_tbl ) do if kotovod.have_selected_item( vv, 1 ) then text = text .. " • " .. colour .. get_inv_name( vv ) .. "\\n" .. "%c[default]" end end local last = "Так-с, ну... В общем, могу подлатать всё, кроме этих экземпляров: \\n" .. text .. "" db.actor:give_talk_message( last, "ui\\ui_iconsTotal", Frect():set( 0, 0, 0, 0), "simple_answer_item" ) vergas_bad_tbl = {} end function vergas_repair_items( dlg ) local phr = task_manager.Dlg_AddPhrase( dlg, "Здравствуй, не мог бы ты подсобить с ремонтом?", "0", "", -10000 ) local phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "sak_dialog.generate_vergas_tbl" ) phr = task_manager.Dlg_AddPhrase( dlg, "Давай посмотрим, что там у тебя.", "1", "0", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddDontHasInfo( "vergas_repair_starting" ) phrase_script:AddPrecondition( "sak_dialog.klava_done()" ) phrase_script:AddAction( "sak_dialog.show_not_available" ) for k, v in pairs( vergas_tbl ) do -- Наличие и название предмета phr = task_manager.Dlg_AddPhrase( dlg, "".. get_inv_name ( v.sect ) ..".", k + 1, "1", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition( "kotovod.have_selected_item( \"".. v.sect .."\", 1 )" ) -- Цена составит phr = task_manager.Dlg_AddPhrase( dlg, v.text, k + 100, k + 1, -10000 ) phrase_script = phr:GetPhraseScript() -- Согласен phr = task_manager.Dlg_AddPhrase( dlg, "Хорошо, я согласен. Вот деньги.", k + 1000, k + 100, -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition( "sak_dialog.money_have( ".. v.cost .." )" ) phrase_script:AddAction( "sak_dialog.relocate_money( ".. v.cost ..", 'out' )" ) phrase_script:AddAction( "sak_dialog.vergas_repair_start( ".. v.time_need ..", \"".. v.sect .."\", ".. v.obj .." )" ) -- Отказ phr = task_manager.Dlg_AddPhrase( dlg, "Может в другой раз...", k + 2000, k + 100, -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "dialogs.break_dialog" ) end phr = task_manager.Dlg_AddPhrase( dlg, "Я немного занят. Ты лучше попозже загляни...", "200", "0", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddHasInfo( "vergas_repair_starting" ) phrase_script:AddPrecondition( "sak_dialog.klava_done()" ) phr = task_manager.Dlg_AddPhrase( dlg, "Позже, так позже...", "201", "200", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "dialogs.break_dialog" ) phr = task_manager.Dlg_AddPhrase( dlg, "А мне вроде кто-то обещал за блокнот починенный что-то? Слово держать нужно.", "300", "0", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition( "sak_dialog.not_klava_done()" ) phr = task_manager.Dlg_AddPhrase( dlg, "Ну ладно, будет тебе \"что-то\".", "301", "300", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "dialogs.break_dialog" ) end function vergas_repair_start( time_need, sect, obj ) -- log2( "time_need is %s, sect is %s, obj is %s", tostring( time_need ), tostring( sect ), tostring( obj ) ) local cfg = this.repair_config[ r_vergas ] if cfg.info_start then db.actor:give_info_portion( cfg.info_start ) end if t_repair[ r_vergas ] == nil then t_repair[ r_vergas ] = {} end sak.relocate_item( "out", sect, 1 ) t_repair[ r_vergas ].time_need = time_need t_repair[ r_vergas ].time_end = misc.game_time_minutes() + time_need t_repair[ r_vergas ].section = sect local obj = client_obj( obj ) if obj:is_outfit() then misc.release_obj( obj ) else kotovod.release_addons_new( obj, sect, obj ) misc.release_obj( obj ) end end function vergas_repair_dlg( dlg ) vergas_repair_items( dlg ) end Ссылка на комментарий
Zander_driver 10 166 Опубликовано 9 Февраля 2022 Поделиться Опубликовано 9 Февраля 2022 08.02.2022 в 11:22, Котовод сказал: Ребята, есть какой-то способ принудительного обновления диалогов такого типа? Есть. Называется - движок OGSR. Читать вики. 2 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
SpyFox_007 18 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 Здравствуйте, у меня вопрос: можно ли динамически, через скрипт изменять "fire_wound_immunity" у "actor". Ссылка на комментарий
EGER.OVERKILL WF 3 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 (изменено) Доброго времени суток, господа. Благодарю за внимание, и попрошу сильно не пинать, (Заранее извиняюсь за возможный оффтоп, если уже было(а я не знал)) Как сделать такую картину: ГГ открывает инвентарь, и убирает все оружие (по открытию инвентаря, все оружие в активных слотах, убирается), Потому как, у меня пока получились только: а) вылеты б)все что используется по кнопке действия - стало неиспользуемым (нельзя говорить, открывать двери и тд.) Тени Чернобыля, Версия игры 1.0004 Сделал так: Скрытый текст Создал отдельный файл и вписал ф-ию: function inv() if active_slot~=inventory_slots.NO_ACT_SLOT then local gg = db.actor local item = gg:item_in_slot(1),(2),(3),(4),(5) then if item and item:section() == "item" then db.actor:hide_weapon() end end И две другие ниже (из фикса оп.2.1 "фикс - убирания оружия при открытии инвентаря") (убрал комментарии) -- Апдейт прятание оружия игрока во время диалога if weapon_hide == true or self.object:is_talking() then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false end end --function start() hide_and_disable=function() local active_slot=db.actor:active_slot() keyvals():set("active_weapon_slot",active_slot) --ключ в контейнере по умолчанию if active_slot~=inventory_slots.NO_ACT_SLOT then db.actor:activate_slot(inventory_slots.NO_ACT_SLOT,true) --спрячем с анимацией активное оружие end db.actor:hide_weapon() --запретим использование слотов end show_and_enable=function() db.actor:clear_blocked_slots() --разрешим использование слотов local stored_slot=keyvals():get("active_weapon_slot",inventory_slots.NO_ACT_SLOT) --ключ в контейнере по умолчанию if stored_slot~=inventory_slots.NO_ACT_SLOT then db.actor:activate_slot(stored_slot,true) --активируем с анимацией сохраненный слот end end need_update = true end При запуске любой из них , под любым предлогом и условием, либо вылет, либо не рабочие двери/диалоги (Все что юзается на клавишу) Подключал к bind_stalker.script к actor:reinit , в начале. Поправьте меня пожалуйста, потому что эффект "третьей руки", хочется пофиксить у себя в сборочке. Поправьте/направьте, подскажите как, где и с чем это едят, желательно ткните носом. Поиск по форуму, мне мало что дал, может я карлан и мало что знаю (Не там ищу). Изменено 10 Февраля 2022 пользователем EGER.OVERKILL WF Ссылка на комментарий
mole venomous 2 959 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 35 минут назад, EGER.OVERKILL WF сказал: ГГ открывает инвентарь, и убирает все оружие В файле inventory.script: Скрытый текст -- Открытие/закрытие инвентаря function on_inventory_info(info_id) if info_id == "ui_inventory" then inventory_open = true if debug == true then get_console():execute("inventory_open") end bind_stalker.hide_weapon() -- убираем ствол elseif info_id == "ui_inventory_hide" then inventory_open = false need_update = true if debug == true then get_console():execute("inventory_close") end bind_stalker.restore_weapon() end end Здесь могла быть ваша реклама. Ссылка на комментарий
EGER.OVERKILL WF 3 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 2 часа назад, mole venomous сказал: В файле inventory.script: Показать -- Открытие/закрытие инвентаря function on_inventory_info(info_id) if info_id == "ui_inventory" then inventory_open = true if debug == true then get_console():execute("inventory_open") end bind_stalker.hide_weapon() -- убираем ствол elseif info_id == "ui_inventory_hide" then inventory_open = false need_update = true if debug == true then get_console():execute("inventory_close") end bind_stalker.restore_weapon() end end Спасибо, а подскажи пожалуйста, где его искать, потому что я по путям config/scripts , и scripts не нашел ничего похожего. Добавлено Опричник, 10 Февраля 2022 Изучите "Правила цитирования". Ссылка на комментарий
mole venomous 2 959 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 (изменено) 3 часа назад, EGER.OVERKILL WF сказал: где его искать del Изменено 10 Февраля 2022 пользователем mole venomous Здесь могла быть ваша реклама. Ссылка на комментарий
EGER.OVERKILL WF 3 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 1 час назад, mole venomous сказал: Если там нет, распакуй последние архивы gamedata.db... или обратись сюда. Распаковал, к сожалению, такого файла у меня нет. Спасибо, надеюсь найду то что ищу. Ссылка на комментарий
ted.80 222 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 5 часов назад, mole venomous сказал: В файле inventory.script: Я конечно дико извиняюсь, а по точнее можно про этот файл? Скрытый текст Ссылка на комментарий
mole venomous 2 959 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 (изменено) 1 час назад, ted.80 сказал: по точнее можно про этот файл del Изменено 10 Февраля 2022 пользователем mole venomous Здесь могла быть ваша реклама. Ссылка на комментарий
EGER.OVERKILL WF 3 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 50 минут назад, ted.80 сказал: а по точнее можно про этот файл? Я просто надеюсь, что быть может он подумал из-за названии функции (fuction inv), так и обозвал этот файл. (потому как у меня файл в котором это все написано, называется по другому) Но тем не менее, тогда наклевывается следующий: к чему подключать это в bind_stalker.script (если это вообще, к нему отношение имеет). 3 минуты назад, mole venomous сказал: Расширение .script Я же указал. А это точно тч? Может версия другая, ну потому как я на голой игре, и в распакованных .db архивах , его не вижу (Аналогично по пути gamedata/config/scripts) , а по запросу в гугле, выдает вообще картинки, с инвентарем ЗП 11 минут назад, mole venomous сказал: Значит, его нет в оригинале. Тогда, у меня предсказуемо, выходит еще один вопрос: А где мне его тогда взять, и к чему подключать? Какой-то непонятный совет получился. Скажи хоть откуда ты его взял-то. 1 Ссылка на комментарий
mole venomous 2 959 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 @EGER.OVERKILL WF В бинд_сталкер на коллбек actor_binder:info_callback повесь вызов function actor_binder:info_callback(npc, info_id) ... inventory.on_inventory_info(info_id) ... end А вот файл, поправь его под себя, если надо inventory 12 минут назад, EGER.OVERKILL WF сказал: Скажи хоть откуда ты его взял-то Моя ошибка. Забыл, что файл не из оригинала. Скинул на диск, думаю, разберёшься. 1 Здесь могла быть ваша реклама. Ссылка на комментарий
EGER.OVERKILL WF 3 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 8 минут назад, mole venomous сказал: поправь его под себя, если надо inventory Признателен, за файл и за пояснения. Надеюсь если я оставлю только все что связанно с инвентарем, приколов не будет. @mole venomous Не-а, Не фурычит. И с поршнями инвентаря игрался , взятые с gameplay/info_portions Скрытый текст <info_portion id="ui_trade"> <disable>ui_trade_hide</disable> </info_portion> <info_portion id="ui_trade_hide"> <disable>ui_trade</disable> </info_portion> И к коллбекам подключил , без вылетов, но ничего не происходит. Как ни прыгал, ни тужился, ничего , абсолютно. 1 час назад, EGER.OVERKILL WF сказал: Как ни прыгал, ни тужился, ничего , абсолютно. Исключая возможность своей болезни "кривых рук", Проверял только что на своем квесте, при/после взятия квеста пушку достать нельзя. При/после сдачи, пушку снова можно доставать. Что-то либо с кодом ф-ции, либо в подключении. 1 Ссылка на комментарий
ted.80 222 Опубликовано 11 Февраля 2022 Поделиться Опубликовано 11 Февраля 2022 @EGER.OVERKILL WF Привет, всё намного проще, никакие доп. файлы и скрипты не нужны, в bind_stalker.script уже есть проверка - скрыто ли оружие при диалоге (в апдейте) Скрытый текст -- Апдейт прятание оружия игрока во время диалога if weapon_hide == true or self.object:is_talking() then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false end end нужно лишь добавить в нее - всё что нам нужно - просто замени этот кусок кода - вот так: Скрытый текст -- Апдейт прятание оружия игрока во время диалога if weapon_hide == true or self.object:is_talking() or db.actor:has_info("ui_inventory") or db.actor:has_info("ui_trade") or db.actor:has_info("ui_car_body") or db.actor:has_info("ui_pda") or db.actor:has_info("ui_pda_jobs") then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true level.set_time_factor(1) end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false level.set_time_factor(10) end end пользуйся 1 Ссылка на комментарий
EGER.OVERKILL WF 3 Опубликовано 11 Февраля 2022 Поделиться Опубликовано 11 Февраля 2022 3 часа назад, ted.80 сказал: пользуйся Спасибо огромное. Работает! 1 Ссылка на комментарий
Seraph 0 Опубликовано 15 Февраля 2022 Поделиться Опубликовано 15 Февраля 2022 Всем привет) Делаю в ЗП условно заскриптованную симуляцию жизни на базе с фиксированным режимом дня для каждого НПС. В целом всё работает, но хочется внести немного разнообразия и рандомности. Есть ли функция, вызываемая через логику, которая проверяет, занят ли в данный момент какой-то из смарткаверов? В частности - тот, что мы укажем в логике в скобках, например. Конечно, можно всё это завязать на инфопоршни, но не уверен в работоспособности такой схемы на "дальней дистанции", выход в оффлайн и непредвиденные обстоятельства могут всё поломать. Существует, конечно, animpoint_reached, но это ведь для того, в который НПС уже направляется, либо занял его. Ссылка на комментарий
ARTLantist 12 Опубликовано 15 Февраля 2022 Поделиться Опубликовано 15 Февраля 2022 (изменено) А есть где-то на просторах интернета/форумов "пособие" по скриптовым настройкам диалогов? Т.е. то, как например реализованы рандомные фразы у НПС в оригинале (истории, про работу и т.п., которые настраиваются в dialog_manager.script). Т.е. то, как добавлять эти диалоги НПС и актору скриптами. Вроде когда-то видел, но точно не помню, а поисковики выдают только обычные диалоги. Желательно для ЗП, если там вообще есть разница в функциях @Seraph Прописывай логику для всех НПС в смарте (в том числе для дефолтов), ставь, к примеру, таймер, или условие через xr_condition.script, и по достижению поставленной цели (условие или таймер), переключай логику на другую работу. Для разных работ ночью и днём, используй в suitable функцию is_day. Изменено 15 Февраля 2022 пользователем ARTLantist Ссылка на комментарий
Seraph 0 Опубликовано 15 Февраля 2022 Поделиться Опубликовано 15 Февраля 2022 @ARTLantist Ты не понял мой вопрос) Проблем с прописыванием логики и переключением секций нет, меня интересует скриптовая проверка занятости заданного анимпоинта. Ссылка на комментарий
Stalkersof 88 Опубликовано 16 Февраля 2022 Поделиться Опубликовано 16 Февраля 2022 А можно как то скриптом получить значение фпс в игре. В Судьбе Зоны как то получают значение. Мнеб тоже так сделать (изменять радиус алайфа) т.к уровни имеют разный фпс. Ссылка на комментарий
Купер 2 268 Опубликовано 16 Февраля 2022 Поделиться Опубликовано 16 Февраля 2022 @Stalkersof , если по старинке (OGSE+), то как-то так. И посмотреть куда оно по "сигнальной" схеме подключается. 1 1 1 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти